目标C - UIAlertViewDelegate无法访问其他类中的UILabel

时间:2012-11-18 17:21:40

标签: objective-c class delegates uialertview

我是Objective C的新手,并且我知道一个问题必须是一个非常简单的问题 - 我想也许我正在以错误的方式接近它。

我创建了一个UIAlertViewDelegate类,我想成为我在View Controller类中使用的一些UIAlertViews的委托。

当用户按下按钮并输入一些文本时,我希望我的ViewController类中的标签可以使用该文本进行更新。但是,我显然无法从我的UIAlertViewDelegate类引用标签“outputLabel”,除非我以某种方式传递它。

我得到的错误是“使用未声明的标识符'outputLabel'。”

ViewController.h

@interface ViewController : UIViewController <UIAlertViewDelegate>;
...
@property (strong) UIAlertViewDelegate *AVDelegate;

ViewController.m

- (void)viewDidLoad
{
    UIAlertViewDelegate *AVDelegate;
    AVDelegate = [[UIAlertViewDelegate alloc] init];
    [super viewDidLoad];
}

- (IBAction)doAlertInput:(id)sender {
    UIAlertViewDelegate *AVDelegate;
    AVDelegate = [[UIAlertViewDelegate alloc] init];

    UIAlertView *alertDialogue;
    alertDialogue = [[UIAlertView alloc]
                 initWithTitle:@"Email Address"
                 message:@"Please Enter Your Email Address:"
                 delegate:self.AVDelegate
                 cancelButtonTitle:@"OK"
                 otherButtonTitles:nil, nil];
    alertDialogue.alertViewStyle=UIAlertViewStylePlainTextInput;
    [alertDialogue show];
}

UIAlertViewDelegate.m

#import "UIAlertViewDelegate.h"

@implementation UIAlertViewDelegate

- (void)alertView:(UIAlertView *)alertView
clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSString *buttonTitle = [alertView buttonTitleAtIndex:buttonIndex];
    NSString *alertTitle = [alertView title];

    if ([alertTitle isEqualToString:@"Alert Button Selected"] || [alertTitle         isEqualToString:@"Alert Button Selected"]) {

    if ([buttonTitle isEqualToString:@"Maybe Later"])
    {
        outputLabel.text=@"User Clicked: 'Maybe Later'";

UIAlertViewDelegate.h

@interface UIAlertViewDelegate : UIViewController <UIAlertViewDelegate,UIActionSheetDelegate>;

多年前我用Java做过一些工作。我想我必须以某种方式传递我的UIAlertViewDelegate类视图但我不确定语法,会非常欣赏正确方向的指针......

詹姆斯

2 个答案:

答案 0 :(得分:1)

这里有很多你不应该做的事情,但是从影响你问题的主要事情开始....

你不应该发明自己的UIAlertViewDelegate类,这意味着不要这样做......

@interface UIAlertViewDelegate : UIViewController <UIAlertViewDelegate,UIActionSheetDelegate>;

由于UIAlertViewDelegate是一种协议,因此您也无法使用alloc

正确的主要内容是......

@interface ViewController : UIViewController <UIAlertViewDelegate>

这表示您的ViewController可以充当UIAlertViewDelegate,因此您创建警报的代码可以使用delegate:self,而不是尝试创建单独的委托属性或对象。

您可能仍然有疑问,但这些更改应该清理一下。

答案 1 :(得分:0)

您的视图控制器是警报视图的委托,因此,您无需创建委托对象。

使用self(视图控制器)作为委托参数初始化警报视图。

然后在视图控制器中实现委托方法(用于警报视图)。

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIAlertViewDelegate_Protocol/UIAlertViewDelegate/UIAlertViewDelegate.html

委托的目的是使一个对象可以在任何类上进行回调。

我建议阅读协议和授权。

http://developer.apple.com/library/ios/#documentation/General/Conceptual/DevPedia-CocoaCore/Delegation.html#//apple_ref/doc/uid/TP40008195-CH14-SW1

我猜您正在尝试使用警报视图来输入文本,因此您需要将警报视图样式设置为UIAlertViewPlainTextStyle,并通过访问alertView对象中的文本字段在其中一个回调中设置标签。 / p>