相关疑难解决方法(0)

我应该使用哪个-awakeFromNib或-viewDidLoad?

我最近在我的应用程序中遇到了一个问题,我在UIViewController子类的-awakeFromNib方法中创建的一些子视图正 从视图中消失.经过一番探索之后,我发现移动我输入的代码-awakeFromNib-viewDidLoad解决问题.-awakeFromNib当UIViewController从nib中取消归档时,似乎只调用一次,并且-viewDidLoad每次取消归档视图时都会调用它.

那么最佳做法是什么?看起来UIViewController -awakeFromNib不应该向视图添加任何视图,应该完成那种东西-viewDidLoad.我理解正确吗?还是我比我想的更困惑?

cocoa-touch

54
推荐指数
4
解决办法
5万
查看次数

IBOutlet未在awakeFromNib中连接

此处链接的示例代码效果很好,允许UIScrollView显示图像,其中包含分页和预览当前图像之前和之后的图像:

我试图将该示例封装在可以重用的单个控件中.所以我创建了一个PagingScrollView:

@interface PagingScrollView : UIView {
    IBOutlet UIScrollView * scrollView;
}

@property (nonatomic,retain) IBOutlet UIScrollView * scrollView;

@end
Run Code Online (Sandbox Code Playgroud)

用泥土简单实施

- (void) awakeFromNib
{
    [super awakeFromNib];

    NSLog(@"awake from nib");
}
Run Code Online (Sandbox Code Playgroud)

在PagingScrollView.xib中,我将包含UIScrollView和ARScrollViewEnhancer的View与原始ScrollViewPagingExampleViewController xib完全相同.其File's Owner的类设置为PagingScrollView,其scrollView插槽设置为子UIScrollView.

在ScrollViewPagingExampleViewController中,我只是声明:

IBOutlet PagingScrollView   *pagingScrollView;
Run Code Online (Sandbox Code Playgroud)

在IB中,我拖动一个View,将其类设置为PagingScrollView,并将其pagingScrollView插座连接到PagingScrollView.

在awakeFromNib中,scrollView属性为nil.我认为既然scrollView在同一个笔尖中连接在IB中,那么它就可以使用了.

令人困惑的是,在ScrollViewPagingExampleViewController.xib中,有一个名为scrollView的空插座.这可能表明PagingScrollView的实例与PagingScrollView.xib中定义的实例不同.

因此,我无法使用实际的子视图填充UIScrollView.我在这做错了什么?

uiscrollview iboutlet ios awakefromnib

27
推荐指数
2
解决办法
1万
查看次数

awakeFromNib,outlet和storyboards:文档错了吗?

根据NSObject UIKit Additions Reference,出口变量应该按照awakeFromNib调用的时间设置(强调所有我的):

nib加载基础结构将awakeFromNib消息发送到从nib归档重新创建的每个对象,但只有在归档中的所有对象都已加载并初始化之后.当一个对象收到一个awakeFromNib消息时,它保证已经建立了所有的插座和动作连接.

...

要点:由于无法保证从归档实例化对象的顺序,因此初始化方法不应将消息发送到层次结构中的其他对象.可以从awakeFromNib方法中安全地发送到其他对象的消息.

通常,您需要为需要在设计时无法完成的其他设置的对象实现awakeFromNib.例如,您可以使用此方法自定义任何控件的默认配置,以匹配用户首选项或其他控件中的值.您还可以使用它将单个控件还原到应用程序的某个先前状态.

但是,这与我的测试不符,至少使用Storyboard.以下测试的结果似乎与文档相矛盾:

  • 在Xcode中创建一个新的单视图应用程序.
  • 将第二个ViewController拖到故事板上.
  • 为第一个ViewController提供一个按钮,并从该按钮创建一个模式segue,显示第二个ViewController.
  • 为第二个ViewController创建一个ViewController类文件.
  • 在故事板上的第二个ViewController上创建一个标签,并创建一个someLabel从它调用到相应ViewController类的插座.
  • 将以下awakeFromNib实现添加到第二个ViewController:

.

- (void) awakeFromNib {
    [super awakeFromNib];
    if (self.someLabel == nil) {
        NSLog(@"someLabel property is nil");
    }
    else {
        NSLog(@"someLabel property is not nil");
    }

    if (_someLabel == nil) {
        NSLog(@"_someLabel is nil");
    }
    else {
        NSLog(@"_someLabel is not nil");
    }
}
Run Code Online (Sandbox Code Playgroud)
  • 在模拟器中运行应用程序,然后单击按钮.

当我这样做时,我观察到以下记录:

2013-07-01 09:24:35.755 test[498:c07] someLabel property is nil
2013-07-01 09:24:35.758 test[498:c07] _someLabel …
Run Code Online (Sandbox Code Playgroud)

uikit iboutlet ios uistoryboard

24
推荐指数
2
解决办法
6809
查看次数