检查我的UIView是否已经在屏幕上显示的最佳方法是什么。我有UISplitViewController,我试着在点击tableViewCell后显示自定义UIView中的细节。我想做的就是避免重复已经显示的视图,或者如果可能关闭现在并显示新的视图。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"did select row at index path %ld",(long)indexPath.row );
InvoiceDetailsVC *detailsVC = [[InvoiceDetailsVC alloc]initWithFrame:CGRectMake(321, 0,708, 709)];
//here I would like to check if my detailsVC has already been shown
//if not I would like to display in that way
[self.splitViewController.view addSubview:detailsVC];
}
感谢您的帮助 此致
答案 0 :(得分:0)
这是最好的方法..
if ( _pageViewController.isViewLoaded && _pageViewController.view.window)
{
NSLog(@"View is on screen");
}
因为如果屏幕上显示视图,view.window
仅为值。
答案 1 :(得分:0)
另一种选择是覆盖willMoveToSuperview:保持内部。
答案 2 :(得分:0)
每次用户点击表格行时,您都会创建一个InvoiceDetailsVC
对象,以便该点始终不可见。您可能希望在self.splitviewController
中存储对当前所选行/ indexPath的引用,并检查用户是否正在点击相同的row/indexPath
。
请注意,Table DataSource(即数组)必须是静态的,或者您应该相应地更新对当前所选row/indexPath
的引用。
例如:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"did select row at index path %ld",(long)indexPath.row);
if ([self.splitViewController.currentlySelectedIndexPath compare:indexPath] != NSOrderedSame) {
InvoiceDetailsVC *detailsVC = [[InvoiceDetailsVC alloc]initWithFrame:CGRectMake(321, 0,708, 709)];
[self.splitViewController.view addSubview:detailsVC];
// Update reference to currently selected row/indexpath
self.splitViewController.currentlySelectedIndexPath = indexPath;
} else {
// The currently visible view is the same. Do nothing
}
}
答案 3 :(得分:0)
使用 UIView 的窗口属性。 如果尚未添加,则会返回 nil
如果没有,上面应该有用
创建一个类属性并将其用作标志来检查您的detailsVC是否已添加到屏幕中。
例如, 在InvoiceDetailsVC.h头文件或.m文件中,添加以下代码
@property BOOL addedToScreen;
在viewcontroller的viewDidLoad中
-(void)viewDidLoad{
//your code above
self.addedToScreen =NO;
}
最后在你的didselectRow
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
if(self.addedToScreen== NO){
InvoiceDetailsVC *detailsVC = [[InvoiceDetailsVC alloc]initWithFrame:CGRectMake(321, 0,708, 709)];
[self.splitViewController.view addSubview:detailsVC];
self.addedToScreen =YES;
}
}
希望这有帮助,