如何从另一个 ViewController 中选择 UITableViewController 行?

Posted

技术标签:

【中文标题】如何从另一个 ViewController 中选择 UITableViewController 行?【英文标题】:How to select UITableViewController row from ANOTHER ViewController? 【发布时间】:2013-08-30 07:51:42 【问题描述】:

我正在为我的应用程序使用 JASidePanels(Facebook 菜单样式)。

LeftPanel 是我的菜单 (tableView),而我显示内容的 CenterPanel 有一个 collectionView。

当我在中心 collectionView 中点击一个项目时,我还想选择与我的 LeftPanel 中被点击的项目相同的 indexPath,即菜单。

我试过这样做,但没有成功。

-(void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath

    // Other codes ...

    LeftMenuViewController *leftMC = [[LeftMenuViewController alloc] init];
    [leftMC.tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:0];

我该怎么办?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

左侧菜单控制器应该已经存在并且很可能是可见的。因此,创建一个确实不可行(您将在每个选择事件中创建它 - 没有意义)。

我假设左侧菜单和集合视图控制器之间的关系是主从关系(通过导航或其他控制器)。两个控制器相互“交谈”的常用设计模式是@protocol

//CollectionViewController.h
@protocol LeftMenuProtocol;

@interface ...
@property (nonatomic, assign) id<LeftMenuProtocol> delegate; 
...
@end 

@protocol LeftMenuProtocol <NSObject>
-(void)collectionView:(UICollectionView*)collectionView 
   didSelectItemAtIndexPath:(NSIndexPath*)indexPath;
@end

创建集合视图控制器时,将左侧菜单设置为其委托。发生选择时,使用self 和选定的索引路径调用委托方法。

然后菜单可以做出适当的反应,例如通过滚动到正确的行

[self.tableView scrollToRowAtIndexPath:indexPath
  atScrollPosition:UITableViewScrollPositionMiddle 
  animated:YES];

有关协议的一些一般帮助,请参阅Cocoa Core Competencies。

【讨论】:

从您的回答中,我了解到我正在为我的 CenterPanel 中的每个选择事件创建一个新的 LeftMenuViewController,这确实没有意义。抱歉,我对 ios 开发很陌生,所以我不太了解您的代码。你能再解释一下吗?我不知道我应该从上面的代码中写什么。谢谢! 错了!我说过在每个选择事件中创建一个是可行的。这就是你正在做的事情。 -- 协议是 iOS 的一个非常基本的设计模式。查看Cocoa Core Competencies: Protocol。

以上是关于如何从另一个 ViewController 中选择 UITableViewController 行?的主要内容,如果未能解决你的问题,请参考以下文章

在 Swift 中从另一个 ViewController 访问变量

从另一个 .swift 文件调用 ViewController 函数

如何从另一个 ViewController 更新 LineChart

快速从另一个访问 Viewcontroller 的实例

如何从另一个类触发 UIButton?

从另一个 ViewController 呈现故事板 ViewController