2012-01-21 34 views
10

Tôi mới làm quen với bảng phân cảnh và tôi đã thiết lập một khoảng cách từ nút cho bộ điều khiển chế độ xem. Bộ điều khiển xem này là một lớp con tùy chỉnh SFListViewController, có trình khởi tạo được chỉ định initWithList:.Tôi có thể sử dụng phân đoạn với bộ khởi tạo của bộ điều khiển xem được chỉ định không?

Sử dụng trình khởi tạo được chỉ định là cách duy nhất để khởi tạo chính xác bộ điều khiển chế độ xem. Tuy nhiên, khi sử dụng segues thì initializer được chỉ định sẽ không được gọi (rõ ràng).

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"Show List"]) { 
    SFListViewController *listViewController = segue.destinationViewController; 
    // ???? 
    } 
} 

Làm cách nào để đặt segue gọi trình khởi tạo được chỉ định khi được thực hiện?

+0

+1 Đó là một câu hỏi hay, tôi đã có một vấn đề tương tự khi để cho Interface Builder nhanh chóng đối tượng. – Besi

Trả lời

5

Theo tôi biết điều này là không thể vì khung cốt truyện chỉ đơn giản là gọi allocinit trên lớp bạn xác định trong Interfacebuilder. Ngoài ra, thuộc tính destinationViewController của segue là chỉ đọc, do đó bạn không thể đơn giản thay thế ViewController hiện tại.

Cách duy nhất để sử dụng Viết kịch bản có lẽ sẽ là để tạo ra một wrapper lớp mà nội instantiates SFListViewController với các thuộc tính mong muốn và sau đó có chức năng như một đối tượng proxy và do đó truyền viewDid***viewWill*** -methods đến lớp bọc và cũng trở về quan điểm của VC bọc trong một tài sản chỉ đọc view ... Bạn có được ý tưởng.

Nói chung có một số cách khác nhau để khởi tạo một UIViewController trong trường hợp này:

  1. Có một tùy chọn để xác định "Người dùng xác định thời gian chạy Thuộc tính" mà có thể được sử dụng để khởi động.

  2. Ghi đè phương thức prepareForSegue:, như bạn đã thử, trong ViewController gốc của bạn và thực hiện "post-alloc-init-initialisation" tại đó.

  3. Nếu tồi tệ nhất đến tồi tệ nhất, bạn có thể quay lại số IBAction để có thể tự khởi chạy ViewController.

Tôi hy vọng điều này sẽ hữu ích.

Chỉnh sửa: Tôi có thể xác minh rằng Proxy-Approach hoạt động kể từ khi tôi gặp một vấn đề tương tự với ABPeoplePickerNavigationController nơi cách tiếp cận này hoạt động tốt. Vì chúng tôi đã thiết lập điều trong bảng câu chuyện của chúng tôi xin lưu ý rằng bạn phải sử dụng awakeFromNib để thực hiện cấu hình ban đầu (thay vì một số phương thức init).

Đây là mã cho lớp wrapper của tôi:

#import "PeoplePickerViewControllerWrapper.h" 

@implementation PeoplePickerViewControllerWrapper 

@synthesize ppvc = _ppvc; // This is the object I'm proxying (The proxyee so to speak) 
@synthesize delegate = _delegate; 

- (void)awakeFromNib 
{ 
     self.ppvc = [[ABPeoplePickerNavigationController alloc] init ]; 
     self.ppvc.peoplePickerDelegate = self; 
     self.ppvc.addressBook = ABAddressBookCreate(); 
     self.ppvc.displayedProperties = [NSArray arrayWithObject:[NSNumber numberWithInt:kABPersonPhoneProperty]]; 
} 

#pragma mark - View lifecycle 

- (void)loadView 
{ 
    [super loadView]; 
    [self.ppvc loadView]; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.ppvc viewDidLoad]; 
} 

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    [self.ppvc viewWillAppear:animated]; 
} 

-(void)viewDidDisappear:(BOOL)animated{ 
    [super viewDidDisappear:animated]; 
    [self.ppvc viewDidDisappear:animated]; 
} 

-(UIView *)view{ 
    return self.ppvc.view; 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    [self.ppvc viewDidUnload]; 
} 
Các vấn đề liên quan