有没有人知道我如何使用我的自定义UINavigationBar子类,如果我以编程方式实例化UINavigationController (没有IB)? 拖动一个UINavigationController在IB显示我一个导航栏下,并使用身份检验我可以改变类的types,并设置我自己的UINavigationBar的子类,但编程我不能导航控制器的navigationBar属性是只读… 我应该怎么做以编程方式自定义导航栏? IB比“代码”更“强大”吗? 我相信所有可以在IB中完成的工作也可以通过编程来完成。
我的iOS应用程序中的大多数模型都会查询Web服务器。 我想有一个configuration文件存储服务器的基本URL。 它看起来像这样: // production // static NSString* const baseUrl = "http://website.com/" // testing static NSString* const baseUrl = "http://192.168.0.123/" 通过评论一行或另一行,我可以立即改变我的模型指向哪个服务器。 我的问题是,在iOS中存储全局常量的最佳做法是什么? 在Android编程中,我们有这个内置的string资源文件 。 在任何活动 (相当于一个UIViewController ),我们可以检索这些string常量: String string = this.getString(R.string.someConstant); 我想知道如果iOS SDK有一个类似的地方来存储常量。 如果没有,Objective-C的最佳做法是什么?
Objective C中的块语法(实际上C,我假定)是出了名的不协调。 将块作为parameter passing看起来不同于将块声明为ivars,这看起来与typedef块不同。 是否有一个完整的块声明语法列表,我可以随时为您提供快速参考?
NSNumber* n = [[NSNumber alloc] initWithInt:100]; NSNumber* n1 = n; 在上面的代码中,为什么n的retainCount的值设置为2? 在代码的第二行中,我没有使用retain来增加retainCount的数量。 我发现了一个奇怪的情况。 其实retainCount取决于最初的数字: NSNumber *n = [[NSNumber alloc] initWithInt:100]; // n has a retainCount of 1 NSNumber *n2 = [[NSNumber alloc] initWithInt:11]; // n has a retainCount of 2
我有一个关于UILabels的问题。 我甚至不知道这是正确的方法来解决这个问题,但我想更新一个UILabel从0到24显示两个数字,然后循环回零,并再次显示数字序列。 值得注意的是,它需要每隔1/24秒更新一次UILabel。 这是我到目前为止的代码… -(void)viewDidLoad { fpsTimer = [NSTimer scheduledTimerWithTimeInterval: .01 target: self selector: @selector(updateFpsDisplay) userInfo: nil repeats: YES]; } – (void)updateFpsDisplay { for (int i=0; i<100; i++) { NSLog(@"%d", i%24); [timecodeFrameLabel setText:[NSString stringWithFormat:@"0%d", i%24]]; } } 此代码在运行时成功地在控制台的循环中打印出数字1-24,但名为“timecodeFrameLabel”的UILabel只显示03并且不会更改。 有什么build议么?
我有一个17个对象的NSArray ,像这样: NSArray *objArray = [[NSArray alloc]initWithObjects: @"1",@"2",@"3",@"4",@"5",@"6" ,@"7",@"8",@"9",@"10",@"11",@"12",@"13",@"14",@"15",@"16",@"17", nil]; 和一个随机数如下的int : int random = arc4random()%17+1; 我想从这个NSArray得到一个随机对象,即使我closures了应用程序(也许通过使用NSUserDefaults ),而不会重复。 如果我已经得到所有的对象,我想为同一个对象生成一个新的随机序列。
我最近一直在学习Swift。 我决定编写一个混合的Swift / Objective-C应用程序,它使用两种语言实现的相同algorithm进行计算密集型任务。 该程序计算大量素数。 我定义了一个协议,Swift和Objective-C版本的计算对象都应该符合。 这些对象都是单例,所以我在Objective-C中创build了一个典型的单例访问方法: + (NSObject <CalcPrimesProtocol> *) sharedInstance; 整个协议看起来像这样: #import <Foundation/Foundation.h> @class ComputeRecord; typedef void (^updateDisplayBlock)(void); typedef void (^calcPrimesCompletionBlock)(void); @protocol CalcPrimesProtocol <NSObject> – (void) calcPrimesWithComputeRecord: (ComputeRecord *) aComputeRecord withUpdateDisplayBlock: (updateDisplayBlock) theUpdateDisplayBlock andCompletionBlock: (calcPrimesCompletionBlock) theCalcPrimesCompletionBlock; @optional //Without this @optional line, the build fails. + (NSObject <CalcPrimesProtocol> *) sharedInstance; @end Objective-C版本的类实现了上面定义的方法,不用担心。 swift版本有一个方法: class […]
我在纵向模式下有十多个ViewController,但是无论设备的方向如何,我都需要在横向模式下强制一个ViewController。
语境: 假设我们有一个NavigationController和2个viewControllers。 ViewControllerA有一个蓝色的导航ViewControllerB ,而ViewControllerB有一个绿色的。 我把它们设置成这样: override func viewWillAppear(_ animated: Bool) { self.navigationController?.navigationBar.barTintColor = UIColor.blue // Green if ViewController B } 当我从A到B时运行良好,但是当我返回时,navigationBar teint被更新。 就好像它是在viewDidAppear设置的。 预期: 导航栏的导航栏颜色应该没有延迟地更新。 解决scheme尝试 我见过这个post,我试过解决scheme。 它的工作,但会导致导航栏的pipe理更加复杂和痛苦。 (在一个真正的应用程序) 我试图改变ViewWillDisappear方法中的navbar teint。 没有工作。 更多: 这是由ios10 API的变化引起的。 我已阅读发行说明 ,但在这种情况下应该做什么还不清楚。 在iOS 10中,UIKit更新和统一了UINavigationBar,UITabBar和UIToolbar的后台pipe理。 尤其是,对这些视图的背景属性(如背景或阴影图像,或设置条forms)的更改可能会启动条形图的布局传递以parsing新的背景外观。 尤其是,这意味着尝试在layoutSubviews, – [UIView updateConstraints],viewWillLayoutSubviews,viewDidLayoutSubviews,updateViewConstraints或响应布局调用的任何其他方法内部更改这些条的背景外观可能会导致布局循环。 在某些情况下,您可以通过确保在需要对象(如UIImage或UIColor)时总是使用相同的对象实例来打破这些布局循环。 但总的来说,你应该避免这样做。 题: 在iOS 10中处理不同导航控制器之间导航栏变化的最好方法是什么?
我发现这个方法叫- (void)prepareForReuse 。 我阅读文档,但我不明白如何使用它。 当我滚动我的tableview,它卡住,或有慢滚动,我打算使用prepareForReuse 。 有人可以请教我一个很好的教程或给我一些示例代码,所以我可以学习。 对不起,我没有任何代码来certificate我的工作。