执行 segue 时视图出现两次

Posted

技术标签:

【中文标题】执行 segue 时视图出现两次【英文标题】:View appearing twice when performing segue 【发布时间】:2014-10-13 10:00:58 【问题描述】:

我的应用有问题。我正在使用导航控制器和 TableView。 所以在我的第一个视图中,我有一个名为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):

它显示这个:

然后一秒钟后:

【问题讨论】:

【参考方案1】:

抱歉,我知道是什么问题。

就这么简单:

prepareForSegue 在设置 UIView 之前运行。

它只涉及视图控制器,而不涉及视图。

你要做的是……

在转场期间设置一些信息....

-(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;

BTW 不要忘记,如果它是一个非类属性,它就是“赋值”

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

【讨论】:

没有理由它不应该工作 (1) 你需要在你的类 PropDetailViewController 中添加一个新属性,这将是一个(强)字符串。例如,称之为“shouldBeTitle”。在 prepareForSegue 中设置。然后在 viewDidAppear 中记录一下,看看是否正确。如果是这样设置标题!注意尝试viewdidappear,以及viewdidload。取决于你在做什么 是的,我这样做了,但在设置正确视图之前仍有 1 个视图出现。 你是说当你点击一个单元格时,实际上它会生成两个新的 PropDetailViewController ? 是的!那就是我的意思。我认为截图是不言自明的 不,不清楚。好的,您在调用代码时遇到了一些问题。你有另一个看不见的桌子,或者其他什么。添加一些日志以查看它被调用的频率

以上是关于执行 segue 时视图出现两次的主要内容,如果未能解决你的问题,请参考以下文章

从按钮执行 segue 时应用程序冻结

从 CollectionView Cell 以编程方式执行 Segue

如何延迟执行 Segue

如何通过 AlertView 切换到另一个 ViewController 并执行 segue?

通过 Segues,确定用户在啥视图上以及 NavigationController 按钮不出现

Segue 后视图控制器消失