如何在Master-Detail应用程序中加载完全不同的ViewController?

时间:2012-05-14 07:22:35

标签: ios xcode ipad ios5

我有一个Master-Detail应用程序,我想在Master中点击行加载新视图。如果我选择第1行,则视图不同,并且在选择不同的行时,新视图将显示在“详细信息”部分中。我怎样才能实现这个目标?

我正在做这样的事情。问题是 - 如果我第一次选择这两行中的任何一行,视图实际上会发生变化。但是当我点击另一行时,它又不会改变。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{

if(indexPath.row==0){


    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 

    TwitterTweetViewController *detailView=(TwitterTweetViewController *)[storyboard instantiateViewControllerWithIdentifier:@"TwitterDetailView"];

    self.splitViewController.mainViewController = detailView;
    [self.splitViewController.mainViewController viewDidLoad];
    [self.splitViewController viewDidLoad];

}


if(indexPath.row == 1)
{

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; 

    TwitterDetailViewController *detailView=(TwitterDetailViewController *)[storyboard instantiateViewControllerWithIdentifier:@"TwitterDetailView"];

    self.splitViewController.mainViewController = detailView;
    [self.splitViewController.mainViewController viewDidLoad];
    [self.splitViewController viewDidLoad];

}

}

如何更改选择这些行的视图,我该怎么办?

3 个答案:

答案 0 :(得分:0)

有一个很好的方法:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

使用它。在对单元格进行单击后立即调用它。你可以在那里放一些支票。简短的例子:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  if (indexPath.row == 0) {
    SomeViewController *svc = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:nil];
    [self.navigationController pushViewController:svc];
  } else if (indexPath.row > 0 && indexPath.row < 5) {
    SomeOtherViewController *sovc = [[SomeOtherViewController alloc]initWithNibName:@"SomeOtherViewController" bundle:nil];
    [self.navigationController pushViewController:sovc];
  } else {
    AnotherViewController *avc = [[AnotherViewController alloc]initWithNibName:@"AnotherViewController" bundle:nil];
    [self.navigationController pushViewController:avc];
  }
  //some other code if needed
}

希望有所帮助

答案 1 :(得分:0)

您可以创建视图控制器的枚举: -

enum MyViewControllers
{
viewcontroller1
viewcontroller2
viewcontroller3
}

枚举中的constat对应于每个indexPAth的viewcontrollers。

然后在UITAbleVIew didSelectRowAtIndexPath:的委托方法中,使用switch case: -

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath 
    {
    switch(indexPath.row)
{
    case 1:
          Load view1
          break;
    case 2:
          Load view2
          break;
    case 3:
          Load view3
          break;     .
         .
         so on.
    }
}

或者在不同的NavigationControllers(如在iPad中)的情况下,您将不得不使用委托和协议传递数据。在rootViewController中定义协议,然后在详细信息中设置其委托(您要在哪里推送viewcontroller)

类似的东西: -

@protocol SendSelectedINdexDelegate
{
@required
-(void)sendTheIndex:(NSNumber)number.
@end
接口

中的

id <SendSelectedINdexDelegate> delegateSend

设置其属性: -

@property (nonatomic) id delegateSend;

in .m

@synthesize delegateSend

并在didSelectRowAtIndexPath中: -

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
{
[self delegate]sendTheIndex:indexPath.row];

}

在接收控制器处 符合协议 并设置

rootview.delegateSend=self;

并实施协议方法;

-(void)sendTheIndex:(NSNumber)number
{
//nsnumber is your index perform operation based on this.
}

答案 2 :(得分:0)

请注意,如果您使用ARC,则禁止合成具有未指定所有权属性的属性(在.m @synthesize delegateSend中)。