执行 segue 时视图出现两次
Posted
技术标签:
【中文标题】执行 segue 时视图出现两次【英文标题】:View appearing twice when performing segue 【发布时间】:2014-10-13 10:00:58 【问题描述】:我的应用有问题。我正在使用导航控制器和 TableView。
所以在我的第一个视图中,我有一个名为propTableView
的 TableView,它是一个属性列表。当我单击一个单元格时,它会将我带到另一个 ViewController 和另一个名为 propDetailTableView
的 TableView。我执行从PropViewController
到PropDetailViewController
的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 时视图出现两次的主要内容,如果未能解决你的问题,请参考以下文章
从 CollectionView Cell 以编程方式执行 Segue
如何通过 AlertView 切换到另一个 ViewController 并执行 segue?