更新-原因发现!...请阅读以下内容并提出解决方案:

在创建视频来显示此问题时,我发现了为什么会发生这种情况...

当创建新的VC实例时,原始detVC会丢失#imports文件中@implementation DetailViewController.m之间定义的所有控件/元素。

例:
我包括一个重新出现此问题的视频。如图所示,除UISegmentedControlUILabel ..以外的所有控件均起作用,这两个控件在DetailViewController.m中均定义为:

#import "DetailViewController.h"

UISegmentedControl *sortcontrol;
UILabel *incrementLabel;

@implementation DetailViewController


视频链接-http://www.youtube.com/watch?v=2ABdK0LkGiA

我认为我们已经很接近了..等待答案!!

附注:我认为此信息足以使我们找到解决方案,但如果需要,我也可以共享代码。



早点:

我们的应用程序中有一个detailViewController(detVC),通常是从UITableViewController中“推入”。

现在,我们还实现了Push Notifications,它将在通知到达时“模态化”地呈现相同的detVC,这又可以在任何视图控制器上进行。

一切正常,直到显示detVC through通知,而detVC的另一个实例已经是活动视图控制器(之前通过TableView推送)。

当所提供的detVC被关闭时,将发生问题-推送的detVC“失去”了对所有内容的控制权-它指向的数据与以前不同,甚至在按任意索引时,导航工具栏上的UISegmentedControl都指向-1索引!

当我们创建单独的detVC实例时,为什么会发生这种情况?为什么会影响早期的detVC?如何解决/关于目标C的知识在这里需要学习吗? (仅供参考,我们在项目中使用ARC)

谢谢



编辑-一些代码:

按下时:

ProductDetailViewController *detailViewController = [[ProductDetailViewController alloc] init];
detailViewController.hidesBottomBarWhenPushed = YES;
[self.navigationController pushViewController:detailViewController animated:YES];
detailViewController.serverOffset=serverOffset;
detailViewController.prdctIndex = indexPath.row;


通过通知显示时:

- (void)displaySingleProduct:(NSDictionary*)userInfo{
    ProductDetailViewController *onePrdVC = [[ProductDetailViewController alloc] init];
    UINavigationController *addNav = [[UINavigationController alloc] initWithRootViewController:onePrdVC];
    onePrdVC.justOne=YES;
    onePrdVC.onePrdIDtoLoad=[[[userInfo valueForKey:@"prd"] valueForKey:@"id"] intValue];
    [self.navigationController presentModalViewController:addNav animated:YES];
}


detVC中有一个Product类,它从SQLite表的prdctIndex行中存储的值中获取数据。

通过通知关闭呈现的detVC后,推送的detVC的Product类开始指向呈现的detVC中用于Product类的行。而且viewDidAppear中没有这样的代码可以改变Product类。

因此,上述UISegmentedControl问题和其他一些问题正在引起痛苦!基本上,整个detVC行为很奇怪-如果我们只是弹出并重新按下它,它将重新起作用!



编辑2

我有更多信息可能会导致原因。
如果我在viewDidLoad上像这样运行viewDidAppear

if (!justOne) {
    aProduct = [allProducts getProduct:(prdctIndex+1) one:NO];
    [self viewDidLoad];
    [self populateDetails];
}


推送的detVC重新获得控件,并且每个元素/控件开始按预期方式重新工作(但不是以理想的方式)。因此,很明显,提供的detVC的单独实例确实弄乱了先前推送的detVC,并且需要通过viewDidLoad重新设置所有控件/指针。

可以从此信息中得出任何有用的结论吗?

最佳答案

在代码中编写时:

#import "DetailViewController.h"

UISegmentedControl *sortcontrol;
UILabel *incrementLabel;

@implementation DetailViewController


您没有将这些变量定义为实例变量(ivars),因此它们对于每个实例都不是单独的。有三种定义ivars的方法。
1)传统方式,在您的.h文件中。

@interface DetailViewController{
    UISegmentedControl *sortcontrol;
    UILabel *incrementLabel;
}


2)对Objective-C的一些补充增加了对以下两种方式的支持。就像在.m文件中声明它们一样。

@implementation DetailViewController{
    UISegmentedControl *sortcontrol;
    UILabel *incrementLabel;
}


3)如果这些ivars使用属性公开它们,则可以简单地忽略它们的显式定义。因此在.h中:

@interface DetailViewController
@property (strong, nonatomic) IBOutlet UISegmentedControl *sortcontrol;
@property (strong, nonatomic) IBOutlet UILabel *incrementLabel;


然后在.m文件中:

@implementation DetailViewController
@synthesize sortcontrol;
@synthesize incrementLabel;

关于iphone - 为什么单独的ViewController类实例会影响以前的实例?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8872060/

10-14 21:32