检查我的UIView是否已经显示的最佳方法是什么?

时间:2013-12-17 12:00:15

标签: ios objective-c ipad uiview didselectrowatindexpath

检查我的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];
}

感谢您的帮助 此致

4 个答案:

答案 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;
    }
 }

希望这有帮助,