从xib到storyboard的封装性问题

用xib可以调用不同的初始化块。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Fetch Note...
    // Initialize Edit Note View Controller with the fetched Note
    EditNoteViewController *vc = [[EditNoteViewController alloc] initWithNote:note];

    // Push View Controller onto Navigation Stack
    [self.navigationController pushViewController:vc animated:YES];
}

这样我就可以保持变量(在EditNoteViewController中)私有化,而且可以设置变量的默认值。比如:

- (id)initWithNote:(Note *)note {
    // ....
    if (self) {
        self.note = note;
        self.isEditing = YES;
    }
    return self;
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
    //...
    if (self) {
        self.isEditing = NO;
    }
    return self;
}

现在要用storyboard,有两个问题:

1.在prepareForSegue设置变量,怎么不暴露变量或其他实现?
2.能设置默认值吗?

谢谢您的解答。

在使用 Storyboard 时,可以通过在目标视图控制器中定义属性并使用 prepareForSegue 方法来设置变量,而不会暴露这些变量或其他实现。


例如,假设您有一个 Storyboard 中的视图控制器,其中包含一个名为 "note" 的属性,该属性代表要编辑的笔记。您可以在 prepareForSegue 方法中将笔记赋值给该属性,如下所示:

(void) prepareForSegue: (UIStoryboardSegue * ) segue sender: (id) sender
{
    if([segue.identifier isEqualToString: @"editNote"])
    {
        EditNoteViewController * vc = segue.destinationViewController;
        vc.note = self.selectedNote;
    }
}

在这种情况下,selectedNote 是你在源视图控制器中的属性,而 note 是目标视图控制器中的属性。您可以在目标视图控制器中设置其他默认值,如下所示:

(void) viewDidLoad
{
    [super viewDidLoad];
    if(!self.note)
    {
        self.note = [
            [Note alloc] init
        ];
        self.isEditing = NO;
    }
    else
    {
        self.isEditing = YES;
    }
}