【问题标题】:Objective C - UIAlertViewDelegate cannot access UILabel in other classObjective C - UIAlertViewDelegate 无法访问其他类中的 UILabel
【发布时间】:2012-11-18 17:21:40
【问题描述】:

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

我创建了一个 UIAlertViewDelegate 类,我想成为我的视图控制器类中的一些 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 类传递给视图,但我不确定语法,非常感谢指向正确方向的指针......

詹姆斯

【问题讨论】:

  • @you: stackoverflow.com/questions/8688153/… 看看这个“问题”中的代码
  • “当用户按下按钮并输入一些文本时,我希望我的 ViewController 类中的标签可以使用该文本进行更新。”我试图弄清楚您在这里要做什么,以及它与警报视图有什么关系。你到底想做什么?我可以告诉您,您不必创建 UIAlertViewDelegate 类,您的视图控制器将成为警报视图的委托。

标签: objective-c class delegates uialertview


【解决方案1】:

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

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

@interface UIAlertViewDelegate : UIViewController <UIAlertViewDelegate,UIActionSheetDelegate>;

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

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

@interface ViewController : UIViewController <UIAlertViewDelegate>

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

您可能仍有疑问,但这些更改应该会解决一些问题。

【讨论】:

  • 同意菲利普米尔斯的观点。只需在视图控制器中编写此方法 1) - (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
  • 您好,非常感谢您的快速回复。我实际上只是在做这个测试。最初我确实将委托分配为 self,但我想看看我是否可以有一个完整的单独类,它可以作为整个应用程序的委托。这可能吗?如果是这样,你认为我应该怎么做?
【解决方案2】:

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

使用 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 对象中的文本字段在其中一个回调中设置标签。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 2013-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多