0

标题是我认为我需要的,但我会后退一步。我想创建一个类来处理 iOS 应用程序中的某些事情。UIViewcontrollers这个类可能在 iOS 应用程序中被多个调用。该类可能需要UIView在某个阶段显示 a 以供用户输入。UIView所以我的问题是,当我不知道哪个subclassUIViewController调用它时,我该如何显示它?我可以UIView从这个类中添加什么?

我想有两个可能的答案,要么类找到当前的子类,要么将自己UIViewController的调用子类UIViewController传递给类,这样类就知道了。

这应该怎么做。

谢谢大家帮助。

4

3 回答 3

0

您可以将类转换为字符串并进行比较。

例如,假设您的自定义UIViewController子类是CustomViewCon并且UIViewController对象引用是myUnknownClassObject,那么:

NSString *classString = NSStringFromClass([myUnknownClassObject class]);

那么你就可以:

if([classString isEqualToString:@"CustomViewCon"]){
    //do something like maybe present a particular view
    myUnknownClassObject.view = myCustomView; //or anything..
}

同样,您可以检查任何类。

编辑:根据评论的建议,您还可以执行以下操作(更好的方法):

if([[myUnknownClassObject class] isKindOfClass:[CustomViewCon class]]){
    //same as before
}
于 2013-03-11T18:49:01.053 回答
0

我将扩展@ericleaf 关于使用协议和子类的评论。听起来您在问以下问题:

如何创建一个可重用的通用类,在 UIViewController 子类中呈现视图?

一个很好的方法是在你的泛型类中定义一个协议,并让你的视图控制器子类支持这个协议。该协议为您的自定义类定义了一个与之通信的接口delegate,在本例中是一个UIViewController子类。除了协议之外,对象不需要知道关于彼此实现的任何其他信息。

您的自定义对象需要能够在其委托中呈现视图的任何信息都将通过协议方法传递。协议的细节取决于您的需要。您可以让自定义对象“向”委托“询问”信息(例如,我应该将子视图放在哪个视图中?)或者您可以让协议向委托提供信息并让委托处理它(例如,这是您的子视图可以放在任何你想要的地方)。

在 SO 和其他地方有很多关于可用协议的优秀文档。这已经足够长了,所以我保持这个例子相当简单。

带有协议定义的自定义类 .h 文件

// my custom class that adds adds a view to a view controller that supports it's protocol

// forward class definition for the protocol
@class MyAwesomeObject;

@protocol MyAweseomeObjectDelegate <NSObject>
- (UIView *)viewForMyAwesomeObject:(MyAwesomeObject *)awesomeObject;
@end

// this could be defined such that the delegate *must* be a UIViewController. I've left it generic.
@interface MyAwesomeClassObject : NSObject
@property (nonatomic, weak) id <MyAwesomeObjectDelegate> delegate;
@end

自定义类 .m 文件

// MyAwesomeObject.m

#import "MyAwesomeObject.h"

@implementation MyAwesomeObject

// this is a dumb example, but shows how to get the view from the delegate
// and add a subview to it
- (void)presentViewInDelegate
{
    UIView *containingView = [self.delegate viewForMyAwesomeObject:self];
    if (containingView) {
        UIView *subview = [[UIView alloc] initWithFrame:containingView.bounds];
        subview.backgroundColor = [UIColor redColor];
        subview.autoresizingMask = UIViewAutoresizingFlexibleWidth|UIViewAutoresizingFlexibleHeight;
        [containingView addSubview:subview];
    }
}

MyViewController .h 使用自定义对象

// MyViewController.h

@import "MyAwesomeObject.h"

@interface MyViewController : UIViewController <MyAwesomeObjectDelegate>
@property (nonatomic, strong) MyAwesomeObject *awesomeObject;
@end

MyViewController .m 使用自定义对象

// MyViewController.m

@import "MyViewController.h"

@implementation MyViewController

- (void)init
{
    self = [super init];
    if (self) {
        _awesomeObject = [[MyAwesomeObject alloc] init];
        _awesomeObject.delegate = self;
    }
    return self;
}

// MyAwesomeObjectDelegate
- (UIView *)viewForMyAwesomeObject:(MyAwesomeObject *)awesomeObject
{
    return self.view;
}
于 2013-03-11T19:39:38.560 回答
0

你为什么不为此使用块?BaseViewController.h:

@property (copy) void (^addViewBlock)();
- (IBAction)showViewWhenNeeded;

BaseViewController.m:

- (IBAction)showViewWhenNeeded
{
    if (self.addViewBlock)
        self.addViewBlock();
}

在您的子类中,设置该块的操作,并在您觉得应该放置视图时调用该方法。

ChildViewController.m

// within some method, propably init or smth
[self setAddViewBlock:^{
    [self.vied addSubView:...];
}];

// when need to actually add the view
[self showViewWhenNeeded];
于 2013-03-11T20:38:46.560 回答