insertSubview:AtIndex:不起作用

Posted

技术标签:

【中文标题】insertSubview:AtIndex:不起作用【英文标题】:insertSubview: AtIndex: does not work 【发布时间】:2010-12-19 10:49:46 【问题描述】:

我浏览了有关此问题的材料,但仍然无法完全弄清楚。 主要问题是我正在使用这种方法,但视图没有显示...... 该应用程序由两个视图构建 - 主视图(我将其作为子视图添加到主笔尖) - 有一个文本字段,我在其中写一些文本。 有一个按钮,当按下该按钮时,操作方法会加载第二个视图,该视图中有一个带有一些文本的标签。 第一个viewController的源码:

#import <UIKit/UIKit.h>

@class TxtRunnerViewController;

@interface Itai_s_text_app_take_2ViewController : UIViewController 
 int sliderSpeed;
 IBOutlet UITextField  *textInput;
 TxtRunnerViewController *trvc;


@property (nonatomic, retain) IBOutlet UITextField *textInput;
@property (retain, nonatomic) TxtRunnerViewController *trvc;

- (IBAction)sliderChanged:(id)sender;//speed of text show changed

- (IBAction)textFieldDoneEditing:(id)sender;//dor 'DONE' on keyboard
- (IBAction)backgroundTap:(id)sender;//for handling tapping on background

- (IBAction)textEmButtonPressed:(id)sender;

@end

第一个 ViewController 的 .m: #import "Itai_s_text_app_take_2ViewController.h" #import "TxtRunnerViewController.h"

@implementation Itai_s_text_app_take_2ViewController
@synthesize textInput;
@synthesize trvc;


- (IBAction)sliderChanged:(id)sender

 UISlider *slider = (UISlider *)sender;
 sliderSpeed =  (int)(slider.value + 0.5f);//setting the speed determinned by the usr in slider
 NSLog(@"Slider value is %@", sliderSpeed);


- (IBAction)textFieldDoneEditing:(id)sender

    [sender resignFirstResponder];
 NSLog(@"our text input  is %@", textInput.text);


- (IBAction)backgroundTap:(id)sender

 [textInput resignFirstResponder]; 


- (IBAction)textEmButtonPressed:(id)sender

 NSLog(@"button pressed");
 if ([textInput.text length]==0) 
 
  NSString *msg = nil;
  msg = @"Write text to transmit";
  UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Forgot something?"
              message:msg
                delegate:self
             cancelButtonTitle:@"Back" 
             otherButtonTitles:nil];

  [alert show]; 
  [alert release]; 
  [msg release];
 
 else  //init 
  NSLog(@"HI!");
  if (self.trvc == nil)
  
   NSLog(@"if accepted");
   TxtRunnerViewController *tr = [[TxtRunnerViewController alloc] initWithNibName:@"TxtRunner"
                       bundle:nil];
   self.trvc = tr;
   [tr release];
  
  [self.view removeFromSuperview];
  [self.view insertSubview:trvc.view atIndex:0];
  NSLog(@"InsertAtIndex was operated...!");
  //[self.view addSubview:tvc.view];
 


/*
// The designated initializer. Override to perform setup that is required before the view is loaded.
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
    
    return self;

*/

/*
// Implement loadView to create a view hierarchy programmatically, without using a nib.
- (void)loadView 

*/


/*
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
- (void)viewDidLoad 
    [super viewDidLoad];

*/


/*
// Override to allow orientations other than the default portrait orientation.
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);

*/

- (void)didReceiveMemoryWarning 
 // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

 // Release any cached data, images, etc that aren't in use.
 if(self.trvc.view.superview == nil)
  self.trvc = nil;


- (void)viewDidUnload 
 // Release any retained subviews of the main view.
 // e.g. self.myOutlet = nil;



- (void)dealloc 
 [trvc release];
    [super dealloc];

第二个视图是空的(在它的 nib 文件中添加了一个标签): #导入

@interface TxtRunnerViewController : UIViewController 



@end

它的.m 文件是默认文件,没有添加任何代码。 当我在第一个视图中按下按钮时 - 它的视图消失但第二个视图没有出现,只出现一个空白的白色视图,上面什么都没有。

母狗

【问题讨论】:

请将您的代码格式化为输入上方的代码示例“”或
 或 Ctrl+K
很抱歉给您带来不便,代码: 如何编写代码以使#import 出现并缩进代码并结束行(识别新行)? 正如我上面写的,使用“”按钮或选择文本并按 Ctrl+K(在 Mac 上为 cmd+K) 【参考方案1】:

如果你推送 TxtRunnerViewController 它将完全隐藏第一个,但它仍然存在于后台。 (没有 removeFromSuperview)

TxtRunnerViewController *vw = [[TxtRunnerViewController alloc]initWithNibName:@"TxtRunner" bundle:nil];
[self.view pushViewController:vw.view animated:NO];
[vw release];

要删除第一个视图有点困难。您需要在 RootViewController 中实现一个委托,该委托将在单击第一个视图的完成按钮后触发。然后在您的 RootViewController 中执行一些代码,显示第二个视图并删除第一个视图。

对于委托示例,请在创建新项目时打开实用程序示例并了解其工作原理或在线搜索一些示例。

【讨论】:

【参考方案2】:

行: [self.view removeFromSuperview];

从其超级视图中删除视图

然后调用

[self.view insertSubview:trvc.view atIndex:0];

向其添加 trvc - 但该视图已被删除且不再可见。

你需要将 trvc 添加到 superview 中。

【讨论】:

我有点困惑 jamihash - 我该怎么做呢?我认为使用 insertAtIndex 就可以做到这一点。 试过 [super.view insertSubview...] - 也得到了一个空白的 iPhone 屏幕。 删除行 [self.view removeFromSuperview];它应该可以工作。如果您需要删除自己的视图,则必须将 trvc-view 插入另一个视图而不是 self,但现在删除 [self.view removeFromSuperview]; 是的,我做到了,它奏效了,现在我从自我中看到了这两个元素。视图和来自 trvc 视图的笔尖的那些......我真的在这里错过了一些东西...... 真的很抱歉再问,但我相信我的问题也涉及到设计问题:

以上是关于insertSubview:AtIndex:不起作用的主要内容,如果未能解决你的问题,请参考以下文章

UIView类中addSubview和insertSubview之间的区别

insertSubVIew 需要“很长时间”

Swift:UIView.insertSubview( , aboweSubview) 在 iOS 8 上不起作用

一个简单的 insertSubview 案例:belowSubview 不起作用

将先前添加的视图置于前面

使用dwr后,javaweb设置的session超时失效,web.xml和tomcat设置都不起作