代码正在执行,但从函数调用时视图未加载?
Posted
技术标签:
【中文标题】代码正在执行,但从函数调用时视图未加载?【英文标题】: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 中的视图?
【问题讨论】:
【参考方案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] 作为如何在两个视图控制器之间传递数据的基本示例。以上是关于代码正在执行,但从函数调用时视图未加载?的主要内容,如果未能解决你的问题,请参考以下文章