Sim*_*ver 5 uitableview ios segue uistoryboardsegue
Xcode 4.6.1 iOS 6使用故事板
我的问题是这个
我在UIViewController中的UIView上有一个带有动态原型单元的UITableView(它本身嵌入在导航控制器中),我想从一个特定的单元格转到另一个视图
(在任何人建议我应该使用UITableViewController之前,我确实在UIView上有其他东西,所以我出于某种原因设置了这种方式.)
现在我不知道如何创建segue
如果我从原型UITableViewCell拖动来创建一个segue,所有生成的单元格会自动调用segue - 当我只需要一个这样做时.这是正常的行为,如果我通过从UITableViewController拖动创建segue并调用[self performSegueWithIdentifier:....来自我的didSelectRowAtIndexPathMethod,因此只有我想要执行此segue的特定单元格触发它,我会解决这个问题.
在这种情况下我没有UITableViewController - 只是UIView上的UITableView,它是UIViewController子类的一部分
我一直在玩,我刚刚发现我无法从UITableView拖动 - 不允许你这样做,所以这是一个deadend.
我似乎唯一的选择就是从UIViewController中拖出来
所以我试过了,当然XCode在执行segue线上抛出一个错误,告诉我我...没有'LocationTV'的可见界面声明了选择器performSegueWithIdentifier.LocationTv是我的tableview子类.
在这种情况下尝试调用新视图的正确方法是什么
谢谢
西蒙
首先segues
只能在两者之间使用UIViewControllers
.因此,如果您想在同一视图控制器上的两个视图之间执行segue,那是不可能的.
但是如果你想在两个视图控制器之间执行一个segue,那么segue应该由一个视图(在第一个视图控制器内)的动作触发,这是可能的.
所以在你的情况下,如果我理解了这个问题,你想在UIView
点击自定义内部的UITableView的第一个单元格时执行一个segue .最简单的方法是在您的自定义上创建一个委托,该委托UIView
将由您的UIViewController实现,UIView
该委托包含调用委托方法时应该执行segue 的自定义,这是一个简短的示例:
YourCustomView.h
@protocol YourCustomViewDelegate <NSObject>
-(void)pleasePerformSegueRightNow;
@end
@interface YourCustomView : UIView {
UITableView *theTableView; //Maybe this is a IBOutlet
}
@property(weak, nonatomic) id<YourCustomViewDelegate>delegate;
Run Code Online (Sandbox Code Playgroud)
YourCustomview.m
@implementation YourCustomview
@ synthesise delegate;
//make sure that your table view delegate/data source are set properly
//other methods here maybe
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.row == 0) { //or any other row if you want
if([self.delegate respondsToSelector:@selector(pleasePerformSegueRightNow)]) {
[self.delegate pleasePerformSegueRightNow];
}
}
}
Run Code Online (Sandbox Code Playgroud)
YourTableViewController.h
@interface YourTableViewController : UIViewController <YourCustomViewDelegate> {
//instance variables, outlets and other stuff here
}
Run Code Online (Sandbox Code Playgroud)
YourTableViewController.m
@implementation YourTableViewController
-(void)viewDidLoad {
[super viewDidLoad];
YourCustomView *customView = alloc init....
customView.delegate = self;
}
-(void)pleasePerformSegue {
[self performSegueWithIdentifier:@"YourSegueIdentifier"];
}
Run Code Online (Sandbox Code Playgroud)
您可以为委托创建任何方法,也可以自定义行为,这只是一个如何做到这一点的简单示例.
我的解决方案
我最终使用了委托模式
我从我的 UIViewController 中进行了 Segue 拖动 - 特别是从 viewController 图标(里面有一个白色方块的橙色圆圈 - 从故事板中视图下方的名称栏 - 尽管您也可以从侧边栏拖动)到我想要继续的观点。
我需要从表视图上的表视图单元格触发此序列。
表格视图位
所以我在我的表视图头文件中声明了一个协议 - 称为 LocationTV.h - 如下
@protocol LocationTVSegueProtocol <NSObject>
-(void) makeItSegue:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud)
下面我声明了一个财产来容纳我的代表
@property (nonatomic, strong) id<LocationTVSegueProtocol> makeSegueDelegate;
Run Code Online (Sandbox Code Playgroud)
为了真正触发 segue,我在 didSelectRowAtIndexPath 方法中调用了 makeSequeDelegate 上的 makeItSegueMethod
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
switch (indexPath.section) {
DLog(@"selected row %d",indexPath.row);
case dLocation:
{
if(indexPath.row == 2){
[_makeSegueDelegate makeItSegue:self];
} else if (indexPath.row == 7){
Run Code Online (Sandbox Code Playgroud)
UIViewController 位
并设置我的 UIViewController(名为 MultiTableHoldingVC)来实现该协议
@interface MultiTableHoldingView : UIViewController
<EnviroTVProtocol,LocationTVSegueProtocol> {
}
Run Code Online (Sandbox Code Playgroud)
下面我在类方法列表中声明了协议方法(尽管我不确定这是必要的,因为编译器应该知道该方法,因为实现协议的声明本质上是实现该方法的承诺)
-(void) makeItSegue:(id)sender;
Run Code Online (Sandbox Code Playgroud)
然后在我的 UIViewController 的实现文件中,我编写了基本上只调用 preformSegueWithIdentifier 的方法
-(void) makeItSegue:(id)sender{
[self performSegueWithIdentifier:@"ChooseCountryNow"
sender:sender];
}
Run Code Online (Sandbox Code Playgroud)
并将它们链接在一起,就像在头文件中一样,我声明了 tableView 的实例,如下所示
@property (strong, nonatomic) IBOutlet LocationTV *dsLocationTV;
Run Code Online (Sandbox Code Playgroud)
我必须将表视图委托属性设置为 self - 这是我在 UIViewControllers -(void)ViewDidLoad 方法中所做的
_dsLocationTV.makeSegueDelegate = self;
Run Code Online (Sandbox Code Playgroud)
这一切似乎有点拼凑,调用一个方法来调用一个方法,而 allprog 建议更简单(我一生都无法弄清楚为什么它会给我带来错误),但这工作得很好。感谢 allprog 和 danypata 的建议。
希望这对那里的人有帮助
归档时间: |
|
查看次数: |
7892 次 |
最近记录: |