>我有一个 Master-Detail 应用程序,我想在 Master 中单击行时加载一个新视图。如果我选择第 1 行,则视图会有所不同,并且在选择不同的行时,新视图将显示在详细信息部分中。我怎样才能实现这个目标?
我正在做这样的事情。问题是 - 如果我第一次选择这 2 行中的任何一行,视图实际上会发生变化。但是当我单击另一行时,它不会改变。
- (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];
}
}
为了更改选择这些行时的视图,我应该怎么做?
有一个很好的方法:
- (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
}
希望对你有帮助
您可以创建视图控制器的枚举,如下所示:-
enum MyViewControllers
{
viewcontroller1
viewcontroller2
viewcontroller3
}
枚举中的变量将对应于每个索引PAth的视图控制器。
然后在UITAbleVIew的委托方法中做了选择RowAtIndexPath:,使用开关大小写:-
- (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.
}
}
或者,对于不同的导航控制器(如在iPad中),您将必须使用委托和协议传递数据。在rootViewController中定义协议,然后在细节中设置其委托(要推送视图控制器的位置)
像这样的东西:-
@protocol SendSelectedINdexDelegate
{
@required
-(void)sendTheIndex:(NSNumber)number.
@end
在界面中
id <SendSelectedINdexDelegate> delegateSend
设置其属性:-
@property (nonatomic) id delegateSend;
在 .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.
}
请注意,如果您使用的是 ARC,它禁止具有未指定所有权属性的属性的合成(在 .m @synthesize delegateSend 中)。