如何从UIViewController

时间:2017-08-03 06:43:30

标签: ios objective-c uiview uiviewcontroller iboutlet

我有一个由我的ViewController显示的Xib UIView。 Xib包含UILabel和UIButton。我的按钮覆盖了我的xib,我使用它来导航我的SecondViewController并通过委托方法实现这一点。

这是关于我的标签的事情;因为我的按钮是透明的,我可以在按钮下面显示它。我无法做的是从ViewController更改mylabel的文本。

我做了一些搜索并遇到了这样的建议:

  

为子视图创建另一个.nib文件并将子视图放入   那里。然后在该.nib文件中,使文件所有者IOSubview。属性   连接在那里工作得很好。然后只需将子视图添加到   你的IOViewController以编程方式。只记得加载笔尖   首先从bundle获取文件。

     

link:https://stackoverflow.com/a/20294118/1450201

但它对我没有意义,因为我最初创建xib的原因是不止一次使用它。我相信这个问题的解决方案可以简单得多。但是如何??

这就是我的xib的样子: enter image description here

这是一个github repo链接和我的代码:

https://github.com/TimurAykutYildirim/demoView

ViewController.h

#import <UIKit/UIKit.h>
#import "Mini.h"

@interface ViewController : UIViewController <SelectionProtocol>
@property (weak, nonatomic) IBOutlet Mini *miniView;
@property (weak, nonatomic) IBOutlet UILabel *miniLabel;
@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.miniView.delegate = self;
}


-(void) isClicked {
    NSString * storyboardName = @"Main";
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
    UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    [self presentViewController:vc animated:YES completion:nil];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


@end

Mini.h

#import <UIKit/UIKit.h>

@protocol SelectionProtocol;

@interface Mini : UIView

@property (nonatomic, weak) id<SelectionProtocol> delegate;

- (IBAction)btnClick:(id)sender;

@end


@protocol SelectionProtocol <NSObject>

@required
-(void) isClicked;

@end

Mini.m

#import "Mini.h"

@implementation Mini

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    if (self = [super initWithCoder:aDecoder]) {
        [self load];
    }

    return self;
}


- (instancetype)initWithFrame:(CGRect)frame {
    if (self = [super initWithFrame:frame]) {
        [self load];
    }
    return self;
}

- (void)load {
    UIView *view = [[[NSBundle bundleForClass:[self class]] loadNibNamed:@"Mini" owner:self options:nil] firstObject];
    [self addSubview:view];
    view.frame = self.bounds;

    //    ui component properties will be set here

}
- (IBAction)btnClick:(id)sender {

    if ([self.delegate conformsToProtocol:@protocol(SelectionProtocol)]) {
        [self.delegate isClicked];
    }
}

@end

1 个答案:

答案 0 :(得分:2)

更新您的Mini.h以添加标签插座。

<强> Mini.h

#import <UIKit/UIKit.h>

@protocol SelectionProtocol;

@interface Mini : UIView

@property (nonatomic, weak) id<SelectionProtocol> delegate;

@property (weak, nonatomic) IBOutlet UILabel *miniLabel;

- (IBAction)btnClick:(id)sender;
@end


@protocol SelectionProtocol <NSObject>

@required
-(void) isClicked;

@end

并在ViewController中

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    self.miniView.delegate = self;
    self.miniView.miniLabel.text = //set whatever value
}