Ios ViewController用户交互上的.xib文件初始化UIView不工作
我有一个故事板,带有一个使用导航控制器和TabBarController的ViewController。几天来我一直在努力解决这个问题 问题:Ios ViewController用户交互上的.xib文件初始化UIView不工作,ios,objective-c,xcode,storyboard,xib,Ios,Objective C,Xcode,Storyboard,Xib,我有一个故事板,带有一个使用导航控制器和TabBarController的ViewController。几天来我一直在努力解决这个问题 问题: int startPos = self.navigationController.navigationBar.frame.size.height+20; inviteFriendsView = [[InviteFriendsEmailAddressesView alloc] init]; NSArray *nib = [[NSBun
int startPos = self.navigationController.navigationBar.frame.size.height+20;
inviteFriendsView = [[InviteFriendsEmailAddressesView alloc] init];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InviteFriendsEmailAddressesView" owner:self options:nil];
inviteFriendsView = (InviteFriendsEmailAddressesView*)[nib objectAtIndex:0];
[self.view addSubview:inviteFriendsView];
[inviteFriendsView setDelegate:self];
[inviteFriendsView setUserInteractionEnabled:YES];
[inviteFriendsView customizeView];
[inviteFriendsView setAlpha:0.0];
[inviteFriendsView setY:startPos];
- (IBAction)inviteFriendsButtonTapped:(id)sender {
[self.view bringSubviewToFront:inviteFriendsView];
[inviteFriendsView setUserInteractionEnabled:YES];
[inviteFriendsView animate];
}
通常情况下,我无法与视图交互。。。这包括滚动、点击文本字段和按下任何按钮。有东西阻止我与新加载的UIView交互
我尝试过使用init方法,也尝试过使用init with frame方法。虽然视图一直在显示,但这可能不是问题所在
我已经尝试重新制作整个xib文件,重新编码.h和.m文件,并重新连接视图上的所有插座
我被卡住了
在视图控制器中,我正在加载一个UIView,其中包含单独的.xib文件和单独的.h和.m文件
我就是这样做的:
在我的ViewController中的ViewDidDisplay方法:
int startPos = self.navigationController.navigationBar.frame.size.height+20;
inviteFriendsView = [[InviteFriendsEmailAddressesView alloc] init];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InviteFriendsEmailAddressesView" owner:self options:nil];
inviteFriendsView = (InviteFriendsEmailAddressesView*)[nib objectAtIndex:0];
[self.view addSubview:inviteFriendsView];
[inviteFriendsView setDelegate:self];
[inviteFriendsView setUserInteractionEnabled:YES];
[inviteFriendsView customizeView];
[inviteFriendsView setAlpha:0.0];
[inviteFriendsView setY:startPos];
- (IBAction)inviteFriendsButtonTapped:(id)sender {
[self.view bringSubviewToFront:inviteFriendsView];
[inviteFriendsView setUserInteractionEnabled:YES];
[inviteFriendsView animate];
}
显示视图的iAction方法:
int startPos = self.navigationController.navigationBar.frame.size.height+20;
inviteFriendsView = [[InviteFriendsEmailAddressesView alloc] init];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InviteFriendsEmailAddressesView" owner:self options:nil];
inviteFriendsView = (InviteFriendsEmailAddressesView*)[nib objectAtIndex:0];
[self.view addSubview:inviteFriendsView];
[inviteFriendsView setDelegate:self];
[inviteFriendsView setUserInteractionEnabled:YES];
[inviteFriendsView customizeView];
[inviteFriendsView setAlpha:0.0];
[inviteFriendsView setY:startPos];
- (IBAction)inviteFriendsButtonTapped:(id)sender {
[self.view bringSubviewToFront:inviteFriendsView];
[inviteFriendsView setUserInteractionEnabled:YES];
[inviteFriendsView animate];
}
以下是显示如何加载视图的.h和.m文件:
int startPos = self.navigationController.navigationBar.frame.size.height+20;
inviteFriendsView = [[InviteFriendsEmailAddressesView alloc] init];
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InviteFriendsEmailAddressesView" owner:self options:nil];
inviteFriendsView = (InviteFriendsEmailAddressesView*)[nib objectAtIndex:0];
[self.view addSubview:inviteFriendsView];
[inviteFriendsView setDelegate:self];
[inviteFriendsView setUserInteractionEnabled:YES];
[inviteFriendsView customizeView];
[inviteFriendsView setAlpha:0.0];
[inviteFriendsView setY:startPos];
- (IBAction)inviteFriendsButtonTapped:(id)sender {
[self.view bringSubviewToFront:inviteFriendsView];
[inviteFriendsView setUserInteractionEnabled:YES];
[inviteFriendsView animate];
}
inviteFriendsMailAddressesView.h
#import <UIKit/UIKit.h>
#import "InviteFriendsViewDelegate.h"
#import "InviteFriendsNetworkContollerDelegate.h"
#import "InviteFriendsNetworkController.h"
@interface InviteFriendsEmailAddressesView : UIView <UITextFieldDelegate, UITextViewDelegate, InviteFriendsNetworkContollerDelegate, UIGestureRecognizerDelegate>
- (void) customizeView;
- (void) animate;
@property BOOL visible;
@property int y;
@property id<InviteFriendsViewDelegate> delegate;
@property (strong, nonatomic) NSArray *emails;
@property int height;
@property (weak, nonatomic) IBOutlet UIActivityIndicatorView *activityIndicator;
@property (weak, nonatomic) IBOutlet UILabel *inviteFriendsTitle;
@property (weak, nonatomic) IBOutlet UILabel *inviteFriendsDescription;
@property (weak, nonatomic) IBOutlet UITextField *userEmailTextField;
@property (weak, nonatomic) IBOutlet UIImageView *userEmailImageView;
@property (weak, nonatomic) IBOutlet UIButton *addFriendsButtonOutlet;
@property (weak, nonatomic) IBOutlet UILabel *emailAddressesDescription;
@property (weak, nonatomic) IBOutlet UIImageView *viewBackground;
@property (weak, nonatomic) IBOutlet UIView *emailAddressesCellBackground;
@property (weak, nonatomic) IBOutlet UILabel *emailAddressCellTextUILabel;
@property (weak, nonatomic) IBOutlet UIButton *emailAddressCancelButton;
@property (weak, nonatomic) IBOutlet UIView *emailAddressView;
@property (weak, nonatomic) IBOutlet UIButton *sendInviteButtonOutlet;
@property (weak, nonatomic) IBOutlet UIButton *progressSoFarButtonOutlet;
@property (weak, nonatomic) IBOutlet UIScrollView *viewScrollView;
@property (strong, nonatomic) InviteFriendsNetworkController *inviteFriendsNetworkController;
#pragma mark - UITextFieldDelegate Methods
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField; // return NO to disallow editing.
- (void)textFieldDidBeginEditing:(UITextField *)textField; // became first responder
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField; // return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end
- (void)textFieldDidEndEditing:(UITextField *)textField; // may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string; // return NO to not change text
- (BOOL)textFieldShouldClear:(UITextField *)textField; // called when clear button pressed. return NO to ignore (no notifications)
- (BOOL)textFieldShouldReturn:(UITextField *)textField; // called when 'return' key pressed. return NO to ignore.
@end
#导入
#导入“InviteFriendsViewDelegate.h”
#导入“InviteFriendsNetworkContollerDelegate.h”
#导入“InviteFriendsNetworkController.h”
@接口InviteFriendsMailAddressesView:UIView
-(无效)自定义视图;
-(空)动画化;
@可见的财产;
@财产保险;
@属性id委托;
@属性(强、非原子)NSArray*电子邮件;
@属性int高度;
@属性(弱、非原子)IBUIActivityIndicator视图*activityIndicator;
@属性(弱,非原子)IBUILabel*Friendstitle;
@属性(弱、非原子)IBOUTLE UILabel*邀请好友描述;
@属性(弱,非原子)IBOutlet UITextField*userEmailTextField;
@属性(弱,非原子)ibuiImageView*userEmailImageView;
@属性(弱、非原子)IBUIButton*AddFriendsButtonoOutlet;
@属性(弱,非原子)IBOutlet UILabel*emailAddressesDescription;
@属性(弱、非原子)IBUIImageView*viewBackground;
@属性(弱、非原子)IBOUTLE UIView*emailAddressesCellBackground;
@属性(弱,非原子)IBOutlet UILabel*emailAddressCellTextUILabel;
@属性(弱,非原子)IBUIButton*emailAddressCancelButton;
@属性(弱的、非原子的)IBUIView*emailAddressView;
@属性(弱、非原子)IBUIButton*sendInviteButtonOutlet;
@属性(弱、非原子)IBUIButton*进程ArbuttonOutlet;
@属性(弱、非原子)IBOUTLE UIScrollView*viewScrollView;
@属性(强,非原子)InviteFriendsNetworkController*InviteFriendsNetworkController;
#pragma标记-UITextFieldDelegate方法
-(BOOL)textField应该开始编辑:(UITextField*)textField;//返回否以禁止编辑。
-(void)textfielddibeginediting:(UITextField*)textField;//成为第一反应者
-(BOOL)textField应取消编辑:(UITextField*)textField;//返回“是”以允许编辑停止并退出第一响应者状态。否以禁止结束编辑会话
-(void)textfielddidediting:(UITextField*)textField;//即使shouldEndEditing返回NO(例如,从窗口中删除的视图)或endEditing:YES,如果强制也可以调用
-(BOOL)textField:(UITextField*)textField shouldChangeCharactersRange:(NSRange)range replacementString:(NSString*)string;//返回NO以不更改文本
-(BOOL)textField应清除:(UITextField*)textField;//按下清除按钮时调用。返回否以忽略(无通知)
-(BOOL)textField应返回:(UITextField*)textField;//按下“返回”键时调用。返回NO以忽略。
@结束
invitefriendsmailaddresssview.m
#import "InviteFriendsEmailAddressesView.h"
#import "UIFont+Theme.h"
#import "UIColor+Theme.h"
#import "UIImage+Theme.h"
@implementation InviteFriendsEmailAddressesView
@synthesize emails;
@synthesize visible;
@synthesize y;
@synthesize delegate;
@synthesize height;
@synthesize inviteFriendsNetworkController;
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"InviteFriendsEmailAddressesView" owner:self options:nil];
self = [nib objectAtIndex:0];
}
return self;
}
- (id) init {
// self = [[[NSBundle mainBundle] loadNibNamed:@"InviteFriendsEmailAddressesView" owner:self options:nil] objectAtIndex:0];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(themeChanged)
name:@"New Theme Applied"
object:nil];
NSUserDefaults *properties = [NSUserDefaults standardUserDefaults];
if([properties objectForKey:@"emails"]){
emails = [properties objectForKey:@"emails"];
} else {
emails = [[NSArray alloc] init];
}
[self.viewScrollView setDelegate:self];
[self.activityIndicator setHidden:YES];
[self.viewScrollView setScrollEnabled:YES];
//CGRect newScrollViewFrame = self.viewScrollView.frame;
//newScrollViewFrame.origin.y = 0;
//newScrollViewFrame.size.height = keyWindowFrame.size.height;
//[self.viewScrollView setFrame:newScrollViewFrame];
// get the size of the screen and set the content size to the size of the screen plus the bottom bar.
CGRect screenRect = [[UIScreen mainScreen] bounds];
screenRect.size.height = screenRect.size.height-200;
[self.viewScrollView setContentSize:CGSizeMake(screenRect.size.width, 1200)];
[self.viewScrollView setFrame:screenRect];
[_viewScrollView setScrollEnabled:YES];
// 100 is the size of the tool bar.
[self updateEmailListView];
self.userEmailTextField.delegate = self;
UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapGestureCaptured:)];
[self.viewScrollView addGestureRecognizer:singleTap];
//reactionNetworkController
inviteFriendsNetworkController = [[InviteFriendsNetworkController alloc] init];
[inviteFriendsNetworkController setDelegate:self];
return self;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
- (void) updateEmailListView {
// With some valid UIView *view:
for(UIView *subview in [self.emailAddressView subviews]) {
if([subview isHidden] == NO){
[subview removeFromSuperview];
}
}
// if we have email addresses in the email address list.
if([emails count] > 0){
// display and populate scrollview with email addresses.
for(int i =0; i < [emails count]; i++){
// every other view set it white so that it creates a grey, white, grey, white pattern.
if(i % 2 == 0){
[self.emailAddressesCellBackground setBackgroundColor:[UIColor whiteColor]];
} else {
[self.emailAddressesCellBackground setBackgroundColor:[UIColor grayColor]];
}
// generate our background
UIView *newBackground = [[UIView alloc] initWithFrame:CGRectMake(
self.emailAddressesCellBackground.frame.origin.x,
self.emailAddressesCellBackground.frame.origin.y+self.emailAddressesCellBackground.frame.size.height*i,
self.emailAddressesCellBackground.frame.size.width,
self.emailAddressesCellBackground.frame.size.height)];
[newBackground setTag:i];
// generate our email addresses label.
UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectMake(
self.emailAddressCellTextUILabel.frame.origin.x,
self.emailAddressCellTextUILabel.frame.origin.y+self.emailAddressesCellBackground.frame.size.height*i,
self.emailAddressCellTextUILabel.frame.size.width,
self.emailAddressCellTextUILabel.frame.size.height)];
[newLabel setTag:i];
[newLabel setText:[emails objectAtIndex:i]];
// generate the delete button and add a target for the selector when it is pressed.
UIButton *newButton = [[UIButton alloc] initWithFrame:CGRectMake(
self.emailAddressCancelButton.frame.origin.x,
self.emailAddressCancelButton.frame.origin.y+self.emailAddressCancelButton.frame.size.height*i,
self.emailAddressCancelButton.frame.size.width,
self.emailAddressCancelButton.frame.size.height)];
[newButton setTag:i];
[newButton addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchDown];
[newButton setImage:self.emailAddressCancelButton.imageView.image forState:UIControlStateNormal];
// attach the new views to the scrollview
[self.emailAddressView addSubview:newBackground];
[self.emailAddressView addSubview:newButton];
[self.emailAddressView addSubview:newLabel];
}
[self.emailAddressView setHidden:NO];
}
// if we do not have any emails added yet.
else {
[self.emailAddressView setHidden:YES];
}
}
- (void) deleteButtonPressed:(id)sender{
int tag = [sender tag];
NSLog(@"delete button pressed with sender tag: %i", [sender tag]);
NSMutableArray *mutableEmails = [emails mutableCopy];
[mutableEmails removeObjectAtIndex:tag];
emails = mutableEmails;
NSUserDefaults *properties = [NSUserDefaults standardUserDefaults];
[properties setObject:emails forKey:@"emails"];
[properties synchronize];
[self updateEmailListView];
}
- (void) customizeView{
[self.inviteFriendsTitle setFont:[UIFont themeFontNamed:@"viewTitleFont" ofSize:18]];
[self.viewBackground setImage:[UIImage themeImageNamed:@"backgroundImage"]];
[self.inviteFriendsDescription setFont:[UIFont themeFontNamed:@"normalTextFont" ofSize:13]];
[self.emailAddressesDescription setFont:[UIFont themeFontNamed:@"normalTextFont" ofSize:13]];
if(height == 0 &&[delegate respondsToSelector:@selector(getHeight)]){
height = [delegate getHeight];
[self setFrame:CGRectMake(0,
-height,
self.frame.size.width,
height)];
}
}
- (void) animate{
if(visible == YES){
[self slideOut];
visible = NO;
}
else{
[self customizeView];
[self slideIn];
visible = YES;
}
NSLog(@"is user interaction enabled in InviteFriendsView?: %hhd", self.isUserInteractionEnabled);
}
- (void) themeChanged {
[self customizeView];
}
- (void) slideIn {
NSLog(@"Slide in");
[[self superview] setUserInteractionEnabled:NO];
[self.activityIndicator setAlpha:1.0];
[self.activityIndicator startAnimating];
self.alpha = 1.0;
[UIView animateWithDuration:0.5
animations:^{
[self setFrame:CGRectMake(0,
y,
self.frame.size.width,
height)];
}
completion:^(BOOL finished) {
NSLog(@"DID finish slide in");
}];
}
- (void) slideOut{
NSLog(@"Slide out");
if([delegate respondsToSelector:@selector(getY)]){
y = [delegate getY];
}
[self setViewScrollView:self.viewScrollView];
[self setUserInteractionEnabled:YES];
[self.viewScrollView setUserInteractionEnabled:YES];
[self.viewScrollView setScrollEnabled:YES];
[self.viewScrollView setScrollsToTop:YES];
[UIView animateWithDuration:0.5
animations:^{
[self setFrame:CGRectMake(0,
-height+y,
self.frame.size.width,
height)];
}
completion:^(BOOL finished) {
self.alpha = 0.0;
[[self superview] setUserInteractionEnabled:YES];
}];
}
#pragma mark - UITextFieldDelegate Methods
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
return true;
}
// return NO to disallow editing.
- (void)textFieldDidBeginEditing:(UITextField *)textField{
}
// became first responder
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
return true;
}
// return YES to allow editing to stop and to resign first responder status. NO to disallow the editing session to end
- (void)textFieldDidEndEditing:(UITextField *)textField{
}
// may be called if forced even if shouldEndEditing returns NO (e.g. view removed from window) or endEditing:YES called
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
return true;
}
// return NO to not change text
- (BOOL)textFieldShouldClear:(UITextField *)textField{
return true;
}
// called when clear button pressed. return NO to ignore (no notifications)
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
[self addFriendToInviteButtonPressed:self];
[textField setText:@""];
return true;
}
// called when 'return' key pressed. return NO to ignore.
#pragma mark - Button Action Pressed Methods
- (IBAction)addFriendToInviteButtonPressed:(id)sender {
NSMutableArray *mutableEmails = [emails mutableCopy];
[mutableEmails addObject:self.userEmailTextField.text];
NSLog(@"mutableEmails: %@", mutableEmails);
NSUserDefaults *properties = [NSUserDefaults standardUserDefaults];
[properties setObject:mutableEmails forKey:@"emails"];
[properties synchronize];
emails = mutableEmails;
[self updateEmailListView];
[self.userEmailTextField setText:@""];
[self.userEmailTextField resignFirstResponder];
}
- (IBAction)sendInviteButtonPressed:(id)sender {
// send a POST request to the server with the emails.
NSString *stringEmails = [[emails valueForKey:@"description"] componentsJoinedByString:@""];
NSLog(@"stringEmails: %@", stringEmails);
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
int site = 0;
if([[defaults objectForKey:@"Theme"] isEqualToString:@"BOMG"]){
site = 1;
}
[self.inviteFriendsNetworkController inviteFriendsWithAddressList:emails AndSite:site];
}
- (IBAction)progressButtonPressed:(id)sender {
}
#pragma mark - InviteFriendsNetworkControllerDelegateMethods
- (void) didSendAddressList:(NSDictionary *)response{
}
- (void) failedTosendAddressList{
}
#pragma mark - UIGestureRecognizerDelegate methods
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer
{
return YES;
}
- (void)singleTapGestureCaptured:(UITapGestureRecognizer *)gesture
{
[self.userEmailTextField resignFirstResponder];
}
@end
#导入“inviteFriendsMailAddresssView.h”
#导入“UIFont+Theme.h”
#导入“UIColor+Theme.h”
#导入“UIImage+Theme.h”
@实现友好的电子邮件地址视图
@综合电子邮件;
@合成可见光;
@合成y;
@综合代表;
@综合身高;
@综合网络控制器;
-(id)initWithFrame:(CGRect)帧
{
self=[super initWithFrame:frame];
如果(自我){
//初始化代码
NSArray*nib=[[NSBundle mainBundle]loadNibNamed:@“invitefriendsemailaddresssview”所有者:自选项:nil];
self=[nib对象索引:0];
}
回归自我;
}
-(id)init{
//self=[[NSBundle mainBundle]loadNibNamed:@“invitefriendsemailaddresssview”所有者:self选项:nil]objectAtIndex:0];
[[NSNotificationCenter defaultCenter]添加观察者:self
选择器:@selector(themeChanged)
名称:@“已应用新主题”
对象:无];
NSUserDefaults*属性=[NSUserDefaults standardUserDefaults];
如果([properties objectForKey:@“emails”]){
电子邮件=[properties objectForKey:@“电子邮件”];
}否则{
电子邮件=[[NSArray alloc]init];
}
[self.viewScrollView setDelegate:self];
[self.activityIndicator setHidden:是];
[self.viewScrollView设置可滚动:是];
//CGRect newScrollViewFrame=self.viewScrollView.frame;
//newScrollViewFrame.origin.y=0;
//newScrollViewFrame.size.height=keyWindowFrame.size.height;
//[self.viewScrollView设置框:newScrollViewFrame];
//获取屏幕大小,并将内容大小设置为屏幕大小加上底部栏。
CGRect screenRect=[[UIScreen mainScreen]边界];
screenRect.size.height=screenRect.size.height-200;
[self.viewScrollView setContentSize:CGSizeMake(screenRect.size.width,1200)];
[self.viewScrollView设置框架:screenRect];
[_VIEWSCROLLVIEWSETSCROLLENABLED:是];
//100是工具栏的大小。
[自我更新邮件列表视图];
self.userEmailTextField.dele