2

我是 Objective C 的新手,遇到一个我知道一定很简单的问题——我想我可能以错误的方式处理它。

我创建了一个 UIAlertViewDelegate 类,我想成为我的 View Controller 类中的一些 UIAlertViews 的代表。

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

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

视图控制器.h

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

视图控制器.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 类传递给视图,但我不确定语法,非常感谢指向正确方向的指针......

詹姆士

4

2 回答 2

1

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

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

@interface UIAlertViewDelegate : UIViewController <UIAlertViewDelegate,UIActionSheetDelegate>;

因为UIAlertViewDelegate是一个协议,你也不能alloc和它一起使用。

正确的主要是...

@interface ViewController : UIViewController <UIAlertViewDelegate>

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

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

于 2012-11-18T17:35:11.473 回答
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 对象中的文本字段在其中一个回调中设置标签。

于 2012-11-18T20:54:58.290 回答