首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >去塞格还是去didSelectRowAtIndexPath?

去塞格还是去didSelectRowAtIndexPath?
EN

Stack Overflow用户
提问于 2013-11-19 15:04:06
回答 4查看 32.3K关注 0票数 14

下面是我目前正在运行的代码。我有一个故事板设置一个nav控制器和tableview控制器和一个视图控制器。我正在尝试将表设置的NSDictionary的名称传递给详细视图控制器。我是否应该使用prepareforsegue或didselectrowatindexpath,以及如何从字典中获得名称来传递它?

代码语言:javascript
复制
#import "FMInboxViewController.h"
#import "FMDetailViewController.h"

@interface FMInboxViewController ()

@end

@implementation FMInboxViewController

@synthesize keyArray;
@synthesize tableArray;
@synthesize tblDictionary;
@synthesize filteredArray;

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableArray *ary=[[NSMutableArray alloc]init];
    [ary addObject:@"Adam"];
    [ary addObject:@"Fred"];
    [ary addObject:@"Angel"];
    // ... many similar entries
    [ary addObject:@"James"];
    [ary addObject:@"Mukthesh"];

    self.tblDictionary =[self fillingDictionary:ary];
}

表视图数据源

代码语言:javascript
复制
#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return [keyArray count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    NSArray *ary = [self.tblDictionary valueForKey:[keyArray objectAtIndex:section]];
    return [ary count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    NSString *key = [keyArray objectAtIndex:[indexPath section]];
    NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
    NSString *cellTitle = [array objectAtIndex:[indexPath row]];
    cell.textLabel.text = cellTitle;

    // Configure the cell...

    return cell;
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *title = [keyArray objectAtIndex:section];
    return title;
}

//-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//    NSString *key = [keyArray objectAtIndex:[indexPath section]];
//    NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
//    self.selectedName = [array objectAtIndex:indexPath.row];
//    NSLog(@"Selected Name in Did select: %@", self.selectedName);
//    
//    [self performSegueWithIdentifier:@"showDetail" sender:self];
//}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        NSIndexPath *section = [self.tableView indexPathForSelectedRow];
        NSString *key = [keyArray objectAtIndex:section];
        NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
        NSString *cellTitle = [array objectAtIndex:[indexPath row]];
        NSLog(@"Selected Name in Did select: %@", self.selectedName);
    }
}

辅助方法

代码语言:javascript
复制
#pragma mark - Helper Methods

- (NSMutableDictionary *)fillingDictionary:(NSMutableArray *)sentArray {
    keyArray = [[NSMutableArray alloc] init];
    [keyArray removeAllObjects];
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    [sentArray sortUsingSelector:@selector(compare:)];
    for ( NSString *str in sentArray) {
        NSString *charVal = [str substringToIndex:1];
        NSString *charStr = [NSString stringWithString:charVal];
        NSLog(@" charStr = %@", charStr);
        if (![keyArray containsObject:charStr]) {
            NSMutableArray *charArray = [[NSMutableArray alloc] init];
            [charArray addObject:str];
            [keyArray addObject:charStr];
            [dic setValue:charArray forKey:charStr];
        }
        else {
            NSMutableArray *prevArray = (NSMutableArray *)[dic valueForKey:charStr];
            [prevArray addObject:str];
            [dic setValue:prevArray forKeyPath:charStr];
        }
    }

    return dic;
}


@end

好吧,我把那部分改成如下

代码语言:javascript
复制
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *key = [keyArray objectAtIndex:[indexPath section]];
    NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
    self.selectedName = [array objectAtIndex:indexPath.row];
    NSLog(@"Selected Name in Did select: %@", self.selectedName);
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    FMDetailViewController *dvc = (FMDetailViewController *)segue.destinationViewController;
    dvc.name = self.selectedName;
}

然而,现在当我选择行时,名称将不会出现在第一次按下的详细控制器中。如果返回并选择另一个名称,则按下的名称将显示在视图控制器中。对于为什么会发生这种情况,有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-11-19 15:10:42

您需要同时使用这两种方法,在didSelectRowAtIndexPath中您应该调用[self performSegueWithIdentifier:@"identifier" sender:self];

在相同的View中,您应该让prepareForSegue方法从segue中获取destinationViewController,然后在希望设置的视图控制器上设置任何属性。

代码语言:javascript
复制
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.someProperty = [self.someArray objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:@"segueID" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *vcToPushTo = segue.destinationViewController;
    vcToPushTo.propertyToSet = self.someProperty;
}
票数 33
EN

Stack Overflow用户

发布于 2013-11-19 16:31:44

如果可能的话(在几乎所有的标准场景中都是这样),我将使用Interface来触发segue。您仍然需要实现prepareForSegue:来配置目标视图控制器。

为了在IB中创建一个segue,在点击单元格或附件按钮(在单元格的最右侧)时触发一个详细视图,执行以下步骤:

  1. 控件从表视图单元格拖动到目标视图控制器,并释放鼠标或触控板。这将打开小的选择面板。
  2. 选择触发器的来源,或者是"Selection “或” action“,以及segue的类型("push”、“MOD模态”或“customE 214”)。
  3. 在“属性检查器”窗格中,定义segue的“标识符”。"UserShowSegue“。

下面是IB中演示故事板中的一个图像,它演示了如何设置“用户”视图控制器中的“表视图单元”来触发对详细视图控制器的“推送”操作:

票数 28
EN

Stack Overflow用户

发布于 2014-05-16 21:13:40

这可能是一个老问题,但要更详细地说明它可能涉及的是谁:

1-把这两个词都用作'(@Peter-Foti)‘。

2- Segue应该从ParentVC链接到DestinationVC (而不是从原型单元)。

发件人应正确设置。

4-设置'@property (someProperty)‘。

样本代码:

代码语言:javascript
复制
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.someProperty = [self.someArray objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:@"segueID" sender:self.someProperty];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
     UIViewController *vcToPushTo = segue.destinationViewController;
     vcToPushTo.propertyToSet = sender;
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20074953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档