0

编辑-我已经修改以澄清。

//myViewController.h
@property (strong, nonatomic) SCDataObject *dataObject;

在情节提要中,我使用自定义类 myViewController 创建了一个 VC。我给了它故事板 ID myViewControllerStoryboardId。

//anotherClass.m 
UIViewController *viewController = 
[self.storyboard instantiateViewControllerWithIdentifier:@"myViewControllerStoryboardId"];

我实例化了自定义 VC,但请注意,出于几个原因,我故意将其设置为 UIViewController 类型的指针。

//anotherClass.m
//I want to set the property, dataObject, of the instantiated VC, but this doesn't work.
viewController.dataObject = something;

实际对象具有该属性,但指向它的指针属于不同的类。如何设置属性?

4

4 回答 4

2

您需要使用您的 viewcontrollers 类。我用过MyViewController,只需将其替换为您的班级名称。这是代码:

#import "MyViewController.h"
...
MyViewController *viewController = 
      [self.storyboard 
                 instantiateViewControllerWithIdentifier:@"myViewControllerStoryboardId"];

//It works!
viewController.dataObject = something;

编辑:如果您真的不想使用自定义类,请试一试此代码:

[viewController setValue:something forKey:@"dataObject"];

但我想不出这样做的理由。

于 2013-03-22T21:22:28.007 回答
1

如果 myViewController 是 UIViewController 的子类,那么你真的应该这样做:

myViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"myViewControllerStoryboardId"];

您还需要确保将 Storyboard 中自定义 UIViewController 的类从通用 UIViewController 更改为 myViewController(在 StoryBoard 中选择您的 VC,然后转到右侧的第三个选项卡“Identity Inspector” -hand Utilities 屏幕。您可以在那里将自定义 VC 的类更改为您的子类)。

问题编辑后更新:

UIViewController 类是 UIKit 的一部分。任何时候你需要定制一个超出 SB 的 VC,你需要继承 UIViewController(并创建一个定制的 VC)。因此,如果您尝试在不继承 UIVC 的情况下拥有 UIVC 的自定义属性(dataObject),答案是您不能。

话虽如此,也许这个问题并不完全清楚。如果您正在寻找具有属性 dataObject 但具有该子类的多个实例的 UIVC 的子类;您始终可以创建该子类一次,然后拥有该类的多个实例,您将为其赋予不同的名称,因此:

myViewController* viewController1 = [self.storyboard instantiateViewControllerWithIdentifier:@"myViewControllerStoryboardId"];
myViewController* viewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"myViewControllerStoryboardId"];
myViewController* viewController3 = [self.storyboard instantiateViewControllerWithIdentifier:@"myViewControllerStoryboardId"];

它们都是同一个子类 (myViewController) 的不同实例,并且每个实例的 dataObject 的值都是不同的。换句话说,您可以设置:

viewController1.dataObject=someObject;
viewController2.dataObject=anotherObject;
于 2013-03-22T21:22:11.973 回答
0

您会收到警告,但这应该适用于设置:

[viewController setDataObject:something];

这是为了获得:

[viewController dataObject];

为避免崩溃,您可能会执行以下操作:

if ([viewController respondsToSelector:@selector(setDataObject:)])
{
    [viewController setDataObject:something];
}
于 2013-03-22T22:05:30.883 回答
0

如果您只是键入viewControlleras id,虽然您仍然不能直接使用该属性,但您可以向它发送一条与该属性对应的消息,而不会发出警告。您可以使用 respondsToSelector: 来查看它是否支持该属性的访问器功能。

id viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"myViewControllerStoryboardId"];

if( [viewController respondsToSelector:@selector(setDataObject:)] ) {
    [viewController setDataObject:something];
}

就个人而言,我可能只是:

MyViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"myViewControllerStoryboardId"];

viewController.dataObject = something;
于 2013-03-22T22:12:27.373 回答