试图从一个 Viewcontroller 中的 UILabel 获取 NSString 以放置在另一个 Viewcontroller 的 UITextView 中
Posted
技术标签:
【中文标题】试图从一个 Viewcontroller 中的 UILabel 获取 NSString 以放置在另一个 Viewcontroller 的 UITextView 中【英文标题】:Stuck trying to get the NSString from a UILabel in one Viewcontroller to place in a UITextView of another Viewcontroller 【发布时间】:2012-07-21 19:01:22 【问题描述】:我有一个带有两个视图控制器的应用程序,我想在 VC2 内部的 UITextView 中显示来自 VC1 中的 UILabel 的文本。
我已经能够在 VC2 的 viewDidLoad 中从 VC1 访问 UILabel,但实际文本没有出现。
在 VC2 中我创建了一个 VC1 对象并且可以访问 VC1。这是 VC2 viewDidLoad:
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
self.textView.text = vc1Controller.label.text;
但是当我运行应用程序并出现 VC2 时,UITextView 中什么也没有出现。我确实已经连接了它,并且可以通过执行 NSLog(@"Yes"); 来显示文本;比如上面的方法。
当我做一个 NSLog(@”%@”, vc1Controller.label.text);我在输出中得到 NULL。
我需要创建自定义 getter 吗?任何建议表示赞赏。我对所有编程都比较陌生。
【问题讨论】:
“[vc1Controller self.label.text]”有效吗? 您是在哪里以及如何创建 VC1 的?您是如何创建标签的? 我更改了上述内容,我错误地发布了我当前的代码。在 VC2.m 内部,我创建了一个 VC1 的对象。标签是根据用户输入在 VC1 中创建的。 label.text = [label.text stringByAppendingString: 用户输入];但是一旦创建,我会尝试在新的 VC 中显示文本。 【参考方案1】:这是从视图中传递 NSString 的方式:
第一个视图:
@interface ViewController : UIViewController
IBOutlet UILabel *firstLbl;
NSString *firstString;
-(IBAction)labelTouched:(id)sender;
@end
@implementation ViewController
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
firstString = @"I'm the first labels text";
firstLbl.text = firstString;
-(IBAction)labelTouched:(id)sender
ViewController2 *view2 = [[ViewController2 alloc] init];
view2.selectedFirstLabelString = firstString;
[self presentModalViewController:view2 animated:YES];
[view2 release];
第二视图:
@interface ViewController2 : UIViewController
IBOutlet UILabel *secondLbl;
@property (nonatomic, retain)NSString *selectedFirstLabelString;
-(IBAction)done:(id)sender;
@end
@implementation ViewController2
@synthesize selectedFirstLabelString;
- (void)viewDidLoad
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
secondLbl.text = selectedFirstLabelString;
希望这会有所帮助。
【讨论】:
我确实尝试过这个并且 vc1Controller.textString 是(null)。在 VC1 中,我做了一个 NSLog 并且 textString 输出正确,但在 VC2 中却没有。 您是使用 TabBarController 来处理单独的视图,还是在导航控制器中传递视图? 两者都不是。我的项目最初是一个单视图应用程序,我添加了一个新的 UIViewController。当用户在 VC 1 中触摸标签时,它会触发一个操作表,清除标签作为破坏性选项或“查看”以查看标签的内容。如果他们选择“查看”,我想添加一个子视图(VC2)来显示标签的全部内容。我现在有了这个设置,“视图”选项只是改变了 VC1 中 UIView 的 alpha,但我试图在单独的控制器中添加一个新的子视图。我有这个第二版工作,除了我无法访问新视图控制器中的 label.text 。 好的,应该很简单。我创建了一个测试并且它正在工作。要将信息传递给“详细视图”,您必须从详细视图中保留该对象,并在您从第一个视图初始化时传递它。要将信息“第二/第一”传回,您必须在第二个视图中创建一个委托,并从该委托的第一个视图中获取信息。希望这会有所帮助。 知道了。我不能感谢你!伟大的社区在这里提供帮助。【参考方案2】:行内:
self.textView.text = [vc1Controller self.label.text];
您在 [vc1Controller self.label.text]
中使用了 self
关键字,但这将引用当前视图控制器(视图控制器 2)中不存在的 UILabel。将vc1Controller中的label设为属性,然后使用:
vc1Controller.label.text;
访问其文本值。
【讨论】:
我更改了原始帖子以符合您的建议。我确实尝试过这个。我没有收到任何编译错误,但由于某种原因我没有访问文本值。我得到一个 NULL 输出。【参考方案3】:当你在 VC2 中创建一个 VC1 对象时,你显然不是指推送 VC2 的 VC1。
您的 vc2 正在尝试从新创建的 vc1 中读取标签值,而您实际上想从推送 VC2 的 VC1 中读取值。
有几种方法可以让您的代码正常工作:
1) 访问 parentViewController(如果您将 vc2 呈现为模态)
在VC2中,你可以参考你的父控制器:
VC1* vc = (VC1 *)self.parentViewController; VC2.textView.text = vc.label.text;
2) 从导航控制器堆栈访问 vc1: How to access the stack in UINavigationController这个帖子什么都有
3) 使用委托模式。 Custom delegate这一款应有尽有!
希望你觉得这很有用。
【讨论】:
以上是关于试图从一个 Viewcontroller 中的 UILabel 获取 NSString 以放置在另一个 Viewcontroller 的 UITextView 中的主要内容,如果未能解决你的问题,请参考以下文章
使用 UIView 中的按钮从另一个 ViewController 触发方法
如何将 Firebase iOS 中的数据从 TableViewController 传递到另一个 ViewController
Swift - 从 CollectionViewCell 中的 UIButton 推送到 ViewController
多线程 ViewController 中的 UIWebView