ios - 执行 segue 时 View 出现两次

标签 ios objective-c uitableview segue

我的应用有问题。我正在使用导航 Controller 和 TableView。 所以在我的第一个 View 中,我有一个名为 propTableView 的 TableView,它是一个属性列表。当我单击一个单元格时,它会将我带到另一个 ViewController 和另一个名为 propDetailTableView 的 TableView。我执行从 PropViewControllerPropDetailViewController 的 Segue:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *sectionTitle = [aromaPropSectionTitles objectAtIndex:indexPath.section];
    NSArray *sectionProp = [propData objectForKey:sectionTitle];
    propName = [sectionProp objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:@"PropDetail" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"PropDetail"]) {
        PropViewController *propView = segue.destinationViewController;
        propView.title = propName;
        SQLmanager *sqlManager = [[SQLmanager alloc] initDatabase:@"prop_max.sqlite3"];
        NSString *propRequest = [NSString stringWithFormat:@"SELECT id_prop FROM prop_max WHERE prop_name_fr LIKE '%@'", propName];
        NSLog(@"propRequest = %@", propRequest);
        NSString *propId = [sqlManager getString:propRequest];
        NSLog(@"propId = %@", propId);
    }
}

现在我只是更改导航栏的标题。但行为不正常。它没有显示具有新标题的 PropDetailViewController,而是显示具有先例标题的新 PropDetailViewController(如果这是我第一次单击单元格,它不显示任何标题),然后显示 PropDetailViewController 与标题。 这不会是一个问题,但是当我点击左上角的 Back 时,它会让我回到带有旧标题的 PropDetailViewController,我必须点击一个第二次 Back 返回到 PropViewController

我点击一个单元格(我之前点击的是Anti-Douleur,但现在我选择了Actif-Cosémtique): Actif Cosmétique

它显示这个: Old Title

然后一秒钟之后: Good Title

最佳答案

抱歉,我知道问题出在哪里。

就这么简单:

prepareForSegue 在设置 UIView 之前运行。

它只涉及 View Controller ,不涉及 View 。

你要做的是...

在 segue 期间设置一些信息....

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
  {
  if ([[segue identifier] isEqualToString:@"idUber"])
    {
    Uber *uber = [segue destinationViewController];
    uber.classnameToUse = .. whatever ...;
    }
  }

然后在另一个类中......很久以后,当 viewDidLoad 运行时,然后使用该信息。

注意 - viewDidAppear 可能更合适,具体取决于您的情况

-(void)viewDidLoad
  {
  [self loadThisMainSection:self.classnameToUse];

  // note that back during the segue you have CORRECTLY SET .classnameToUse
  // that was a long time ago.  but we only use it now.
  }

就这么简单!

你必须在每个 segue 情况下都这样做。

你最终会得到像“whenYouCanUseThisValue”这样的变量名......

在您的情况下,您需要一个名为的属性:

@property (strong) NSString *useThisTitleLaterWhenYouAreLoading;

顺便说一句,如果它是非类属性,请不要忘记它是“赋值”

@property (assign) CGPoint afterLoadingHereIsThePosition;
@property (assign) CGFloat onceYouLoadUseThisAlpha;

关于ios - 执行 segue 时 View 出现两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26337304/

相关文章:

ios - 如何使用 NSUserDefault 将选定的 TableViewCell 文本发送到之前的 ViewController

ios - iPad Pro Sim 会发生 NSInvalidArgumentException 崩溃,但其他 iPad Sim 不会崩溃

ios - 行分隔符上的标签 - Swift Tableview - 每小时日历

ios - 无法在didSelectRowAtIndexPath中调用cellForRowAtIndexPath而不影响动画?

ios - 解析 JSON 数组的问题

ios - 跨不同设备的圆形个人资料图片缺少 Xcode 适当的自动布局约束

iphone - 表格 View 崩溃

ios - 在 iOS 中聚类 Google map 标记

ios - 在 UITAbleView 中从 URL 加载图像缓慢。

ios - Swift:构建还是不构建