Android" Toast"在iOS中:向邮件添加按钮

时间:2014-10-09 15:44:11

标签: ios xcode uibutton toast unrecognized-selector

我为ToastView创建了一个iOS类(类似于Android的吐司),它在屏幕底部显示一个消息栏。我在ToastView上添加了一个按钮,解决了我原来的错误。用于触摸按钮的NSLog显示在控制台中,但是当单击按钮时我需要将BOOL值发送回HomeViewController并且我不确定如何使用此按钮在两者之间进行通信。有什么帮助吗?

在ToastView.h中

+ (void)showToastInParentView: (UIView *)parentView withText:(NSString *)text withDuaration:(float)duration;
+ (void)undoButtonClicked:(id)sender;
ToastView.m中的

//shows the "toast" message
+ (void)showToastInParentView: (UIView *)parentView withText:(NSString *)text withDuaration:(float)duration {
//code to show message
UIButton *undoButton = [[UIButton alloc] initWithFrame:CGRectMake(toast.frame.size.width - 60.0, toast.frame.size.height - 35.0, 40, 20)];
undoButton.backgroundColor = [UIColor lightGrayColor];
[undoButton addTarget:self action:@selector(undoButtonClicked:) forControlEvents:UIControlEventTouchDown];
}

+(void) undoButtonClicked:(id)sender {
NSLog(@"UNDO BUTTON TOUCHED");
}

我在HomeViewController中使用以下代码调用ToastView:

[ToastView showToastInParentView:self.view withText:@"TOAST MESSAGE!" withDuaration:5.0];

2 个答案:

答案 0 :(得分:1)

您的课程可能如下所示,以便按照您的意愿工作:

@interface ToastView : UIView
- (void)undoButtonClicked:(id)sender;
@end

@interface NotToastView : UIView
@property (weak) ToastView *toastView;
@end

@implementation NotToastView
- (id)initWithFrame:(CGRect)frame {
  if (self = [super initWithFrame:frame]) {
    UIButton *undoButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [undoButton setFrame:self.bounds];
    [undoButton addTarget:self action:@selector(undoButtonClicked:) forControlEvents:UIControlEventTouchUpInside];
    [self addSubview:undoButton];
  }
  return self;
}

- (void)undoButtonClicked:(id)sender {
  [self.toastView undoButtonClicked:sender];
}
@end

最好在这里使用委托协议,而不是要求特定的类。上面的代码没有明确地为toastView属性设置值。我们希望您在UIViewController某处构建这些内容并自行设置值,而不是依靠NotToastView来设置自己的ToastView

答案 1 :(得分:1)

查看更新后的代码,问题来自undoButtonClicked:方法,在您的情况下是一种类方法(前缀为" +")。

您希望通过使用" - "更改前缀来使其成为对象方法。这样,类知道它被调用在这个类的实例化对象上。当您使用addTarget:action:forControlEvents:时,该操作是目标的选择器。

作为Apple says

  

选择器是用于选择要为对象执行的方法的名称

所以它需要是一个对象方法,而不是一个类方法。

您的代码应如下所示:

·H:

+ (void)showToastInParentView: (UIView *)parentView withText:(NSString *)text withDuaration:(float)duration;
- (void)undoButtonClicked:(id)sender;

的.m:

//shows the "toast" message
+ (void)showToastInParentView: (UIView *)parentView withText:(NSString *)text withDuaration:(float)duration {
    //code to show message
    UIButton *undoButton = [[UIButton alloc] initWithFrame:CGRectMake(toast.frame.size.width - 60.0, toast.frame.size.height - 35.0, 40, 20)];
    undoButton.backgroundColor = [UIColor lightGrayColor];
    [undoButton addTarget:self action:@selector(undoButtonClicked:) forControlEvents:UIControlEventTouchDown];
}

-(void) undoButtonClicked:(id)sender {
    NSLog(@"UNDO BUTTON TOUCHED");
}