0

我想从 4-6 个图标的弹出对话框中更改视图上的图像(想象一下,就像在信使应用程序上更改图像一样)。我实现此模式弹出窗口的方式是在 IB 上创建一个新视图,背景不透明,然后将其加载为子视图:

    IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
[self.view addSubview:iconsViewController.view];

所以,当用户触摸一个图标时,我有

- (IBAction)iconIsSelected:(id)sender {
switch ([sender tag]) {
    case 1:
        [(ParentViewController*)[self superview] changeIcon];
        break;
    case 2:
        // same here..
        break;
    default:
        break;
}
[self.view removeFromSuperview];
[self release];

}

changeIcon 只是将 设置image为相应的图标。您可以猜到,这不起作用 - changeIcon 消息永远不会起作用。我不明白我做错了什么,非常感谢任何帮助!

4

2 回答 2

0

视图的父视图是视图,而不是视图控制器,但是您将父视图转换为 class ParentViewController。如果视图没有超级视图,它会返回nil,并且给 nil 的消息是无操作的(这解释了为什么你不会在那里崩溃)。

顺便说一句,[self release]最后是高度可疑的。

于 2010-03-22T19:30:54.917 回答
0

你在这里有几个选择...

第一个是在您的 IconsViewController 类型上创建一个属性ParentViewController*,例如:

@property (readwrite,nonatomic,assign) ParentViewController* parentController; // weak reference

为了进一步分解:

  • readwrite因为我们希望能够通过访问值[self parentController]但也通过改变它[iconsViewController setParentController:self]
  • nonatomic因为我不太担心穿线
  • assign使其成为“弱参考”,其中父母不会被孩子保留。如果他们彼此retain,它可能会导致以后的内存泄漏,因为除非明确释放,否则您最终会得到一个保留圈,导致两个对象都没有达到零保留计数。

从 nib 加载时,设置属性:

IconsViewController *iconsViewController = [[IconsViewController alloc] initWithNibName:@"IconsView" bundle:nil];
iconsViewController.parentController = self;

然后,iconIsSelected像这样从内部调用它:

[[self parentController] changeIcon];

或者,您可以创建一个委托协议:

@protocol IconViewSelectedDelegate (NSObject)

- (void) changeIcon;

@end

并将该协议用作属性,而不是父视图控制器类型。这更抽象,但它使设计更简洁。然后,父视图控制器将实现该委托协议,作为许多其他协议之一。

另一种选择是使用NSNotificationCenter并从您的动态视图发布/订阅事件。这是两个对象之间“最松散”的耦合,但在这种情况下可能有点过分了。

于 2010-03-22T19:41:51.690 回答