【问题标题】:Code is exectuting but the view is not loading when called form a function?代码正在执行,但从函数调用时视图未加载?
【发布时间】:2010-04-27 10:21:25
【问题描述】:

我正在使用基于视图的应用程序做一本书的应用程序。 mainView 充当加载页面的背景视图。每个页面都是不同的视图,并且有自己的 nib。当我在页面上滑动时(实际上是在加载当前视图/页面的 mainView 上),该页面将被删除并添加下一个/上一个页面。

[currentPage.view removeFromSuperview];
[self.view insertSubview:nextPage.view atIndex:0];

我在这个 mainView 中添加了一个带有 barbutton 的 popoverController。它使用名为 popClass 的 tableviewController 类进行初始化。 PopClass 是另一个 UITableViewController 类,它将作为 popViewController 的父类。

self.myPopController = [[PopController alloc] initWithStyle:UITableViewStylePlain];
self.myPopOverController = [[UIPopoverController alloc] initWithContentViewController:myPopController];

当我在弹出窗口中选择某行时,我希望 backgroundview(mainView) 加载与该行号对应的页面。

为此,我在 bookView(mainView) Controller 类中编写了一个函数。并且当我选择某行时从 popOver 的父类调用它。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger toPageNumber = indexPath.row + 1;
[viewController changeToPage:toPageNumber];
}

函数和代码行正在执行,但没有发生任何事情。甚至打印日志行,但不执行任何操作。当我滑动视图/页面时,删除页面和添加另一个页面的代码是相同的。

有什么问题?或者有没有其他方法可以通过使用弹出框来改变 mainView 中的视图?

【问题讨论】:

    标签: iphone uipopovercontroller


    【解决方案1】:

    您需要在弹出框控制器中引用背景视图控制器。

    PopController 控制器中,您应该有一个类似的 delagate:

    @interface PopController: UITablViewController{
    
      //// other varibales;
          id delegate;
    }
    
    @property (nonatomic, retain) id delgate;
    

    现在从你展示 popovercontroller 的类开始

    你应该添加这一行:

    [myPopController setDelegate:self];
    

    然后您可以轻松访问主视图控制器类的任何方法。通过使用

    [delegate callTheRequiredMethod];
    

    希望这会有所帮助。

    谢谢,

    马杜普

    【讨论】:

    • 当我尝试 [delegate callTheRequiredMethod] 时,这个给我警告。说找不到 callTheRequiredMethod。但我有。
    • @dombesz :您是否在 .h 文件中声明了原型。如果您已经添加了,那么只需将类型转换添加到委托变量。
    【解决方案2】:

    不看代码就很难判断出了什么问题。也就是说,这就是我要做的:

    (1)mainView 中选择一行时,以模态方式呈现popoverController

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        PopoverViewController *vc = [[PopoverViewController alloc] init];
        [self.navigationController presentModalViewController:vc animated:YES];        
        [vc release];
    }
    

    (2)popoverController 发生变化时,例如选择了一行,在parentViewController 中设置一个值(应该是MainView):

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
        self.parentViewController.value = someValue;
        [tableView deselectRowAtIndexPath:indexPath animated:YES];
    }
    

    (3) 关闭popoverController,无论您选择在哪里打电话:

    [self dismissModalViewControllerAnimated:YES]`
    

    【讨论】:

    • 我不会那样引用 parentViewController。相反,我会使用委托模式或通知系统。这样,类的可重用性和松散耦合性就大大提高了。
    • 我之前在示例应用程序中使用了委托来实现同样的目的,它产生了相同的结果。这就是为什么我走得很辛苦。我将在这个应用程序中尝试它并检查它是否正常工作。
    • 现在它工作正常且完美。非常感谢。如果你没有提到委托,我就不敢再试一次了。
    • @Rengers,是的,你完全正确,我也会尽可能使用代表。我只是使用 [UINavigationController parentViewController] 作为如何在两个视图控制器之间传递数据的基本示例。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-08
    • 1970-01-01
    • 2019-12-13
    • 2021-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多