簡體   English   中英

UIViewController:[超級init]調用[自身initWithNibName捆綁包:]

[英]UIViewController: [super init] calls [self initWithNibName bundle:]

我的UIViewController子類中有兩個初始化函數:

- (id)init
{
    self = [super init];
    if (self)
    { 
           // Custom stuff
        return self;
    }
    return nil;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName: nibNameOrNil 
                           bundle: nibBundleOrNil];
    if (self) 
    {
        // Custom stuff
    }
    return self;
}

我放置了init函數,以避免調用initWithNibName:bundle:方法。 我正在嘗試將xib文件取出。 不幸的是,通過調用[super init]來調用此init [[Myclass alloc] init]會調用initWithNibName:bundle:。

首先,我應該在文檔中的哪個位置閱讀,以便期望對父init方法的調用會調用我自己的initWithNibName:bundle:方法?

其次,這對蘋果來說是一個好的設計選擇。 我不明白為什么這是理想的行為? (可能是我沒有在這里看到大圖,所以請隨時向我提示。)

第三,如何最好地解決它。 我是否只將initWithNibName:bundle:從我的代碼中刪除? 在任何情況下,我都不希望選擇使用xib或手動實例化該類。

通常,我必須使用托管對象上下文來初始化我的視圖控制器。 我實現了簡單的-(id)initWithContext:方法,在此方法中,我稱為super的initWithNibName:bundle:方法。 這樣,我可以定義自己的xib名稱。

不確定問題的第一部分(即閱讀的東西),但是Apple的VC類模板顯示它們具有自己的initWithNibName:bundle方法,該方法以與給定的相同參數調用super。 因此,從您的情況來看,我想確切地說這是指定的初始化程序,在super上調用簡單的init方法並不安全,因為它將調用initWithNibName:bundle 我相信UIViewController的初始化看起來像這樣:

- (id)init
{
  self = [self initWithNibName:nibNameDerivedFromClass bundle:probablyNilOrMainBundle];

  if (!self) return nil;

  // some extra initialization

  return self;
}

由於超類沒有initWithNibName:bundle因此它必須自己調用方法,使其成為指定的初始化程序。 由於您已重寫它,因此ObjC的運行時將您的類中的self替換為該方法。

如果要從UIViewController的GUI的創建中排除Interface Builder,則必須重寫loadView並自己創建視圖。 不要實現initWithNibName:bundle:

- (void)loadView {
    // Init a view. The frame will be automatically set by the view controller.
    UIView *view = [[UIView alloc] initWithFrame:CGRectZero];

    // Add additional views (buttons, sliders etc.) to your view here.

    // Set the view controller's view to the new view.
    self.view = view.
}

首先,我應該在文檔中的哪個位置閱讀,以便期望對父init類的調用會調用我自己的initWithNibName:bundle:方法?

您不知道,這是設計的事情。 init不是所有類的基本初始化方法

其次,這對蘋果來說是一個好的設計選擇。 我不明白為什么這是理想的行為? (可能是我沒有在這里看到大圖,所以請隨時向我提示。)

init調用它時,它將發送nil名稱和bundle,並且默認為空的xib文件。 總有一個xib文件,無論您是不是。

第三,如何最好地解決它。 我是否只將initWithNibName:bundle:從我的代碼中刪除? 在任何情況下,我都不希望選擇使用xib或手動實例化該類。

你不知道 如果您只是調用super,而只是轉發方法,則實際上並不需要那里的代碼。

您可以自定義視圖並在viewDidLoad方法中添加子視圖。 在此方法中,您可以通過檢查屬性nibName來檢查是否使用init或initWithNibName:bundle:創建了該類。 使用init時,nibName將為nil。

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (!self.nibName) {
        // View was not loaded from nib - setup view
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM