如何从'sender'对象访问用户定义的运行时属性?

eri*_*ric 14 xcode objective-c interface-builder ios

我有一个UIButton故事板场景.该按钮配置了User-Defined-RunTime-Attribute'type'(String).按下按钮调用

-(IBAction)pressedButton:(id)sender

我能从"发件人"访问用户定义的运行时属性吗?

tro*_*foe 22

是:

-(IBAction)pressedButton:(id)sender
{
    id value = [sender valueForKey:key];
}
Run Code Online (Sandbox Code Playgroud)

请注意,您不能使用"用户定义的运行时"属性,除非您将UIButton子类化并将其添加为强属性,例如

@interface UINamedButton : UIButton
@property (strong) NSString *keyName;
@end
Run Code Online (Sandbox Code Playgroud)

如果您设置了"用户定义的运行时"属性,但尚未执行此操作,则不幸的是Xcode会严重崩溃.

然后,您可以获得该值

-(IBAction)clicked:(UIControl *)sender
    {
    NSString *test = @"???";

    if ( [sender respondsToSelector:@selector(keyName)] )
            test = [sender valueForKey:@"keyName"];

    NSLog(@"the value of keyName is ... %@", test);

    // if you FORGOT TO SET the keyName value in storyboard, that will be NULL
    // if it's NOT a UINamedButton button, you'll get the "???"

    // and for example...
    [self performSegueWithIdentifier:@"idUber" sender:sender];
    // ...the prepareForSegue could then use that value in the button.

    // note that a useful alternative to
    // if ( [sender respondsToSelector:@selector(stringTag)] )
    // is... 
    // if ( [sender respondsToSelector:NSSelectorFromString(@"stringTag")] )
    }
Run Code Online (Sandbox Code Playgroud)