使用 IBAction 将数据传递到另一个视图控制器而无需 segue swift

Posted

技术标签:

【中文标题】使用 IBAction 将数据传递到另一个视图控制器而无需 segue swift【英文标题】:passing data to another view controller with IBAction without segue swift 【发布时间】:2016-03-01 16:47:29 【问题描述】:

我有一个简单的应用程序,我想通过一个按钮将数据传递给另一个视图控制器,而不用继续它。所以基本上在一个视图控制器上我有一个文本框,用户在其中输入名称,当他们按下提交按钮时,我希望他们的名称传递给另一个包含标签但不导航到该视图的视图控制器,停留在视图控制器上有提交按钮

这是我提交数据的按钮的 IBAction:

 @IBAction func addPlant(sender: AnyObject)
   
 

【问题讨论】:

根本不清楚您实际上要做什么。另一个视图控制器是否已经存在?即,它是在导航控制器的堆栈中还是在拆分视图控制器的另一个面板中更高? @EricD。这不是重复的,因为它正在谈论将数据传递给正在打开的 VC,而不是使用 segue 来完成。这是关于根本不开设新的 VC。 @EricD。也许......但那里仍然有很多假设(比如用instantiateViewControllerWithIdentifier创建新的视图控制器(并且可能不会保存它,所以你实际上没有做任何事情)真的只是没有足够的信息在说出他真正想做的事情的问题:) 为糟糕的解释道歉,我从来都不擅长,我有一个带有 2 个按钮的主菜单屏幕,一个按钮将导航到视图控制器,用户可以在其中输入他们的姓名并提交它,主菜单上的另一个按钮会将用户定向到已提交的姓名列表,我需要帮助将数据从提交页面上的文本框传递到另一个页面上的列表,而无需任何导航。 @大卫贝瑞 【参考方案1】:

您可以使用委托来实现这一点。

你使用的是 swift 还是 Objective-c?

创建委托的一般步骤是

    创建委托协议(定义 View 希望 Controller 处理的内容) 在 View 中创建一个委托属性,其类型为该委托协议 使用视图中的委托属性来获取/执行它无法拥有或控制的事情 控制器声明它实现了协议 Controller 通过设置上面#2 中的属性将self 设置为View 的委托 在控制器中实现协议

【讨论】:

【参考方案2】:

当提交按钮被按下时,您可以将用户名故事到所有控制器都可以获取的地方,例如 UserDefault、SQLit。

#import "ViewController.h"

@interface ViewController ()
//where the user enters name
@property (weak, nonatomic) IBOutlet UITextField *userNameTF;

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];


- (IBAction)submit:(id)sender 
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    /**
     *  story the userName into NSUserDefaults
     */
    [userDefaults setObject:self.userNameTF.text forKey:@"userName"];
    //if ios8 need:
    [userDefaults synchronize];


@end

另一个视图控制器

#import "OtherViewController.h"

@interface OtherViewController ()
@property (weak, nonatomic) IBOutlet UILabel *userNameLabel;

@end

@implementation OtherViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //get the userName from NSUserDefaults
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    self.userNameLabel.text = [userDefaults objectForKey:@"userName"];





@end

Swift版--------------------------------- 视图控制器:

import UIKit

class ViewController: UIViewController 
    @IBOutlet weak var userNameTF: UITextField!

    override func viewDidLoad() 
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    

    @IBAction func addPlant(sender: AnyObject) 
        let userDefaults = NSUserDefaults.standardUserDefaults();
        /**
        *  story the userName into NSUserDefaults
        */
        userDefaults.setObject(userNameTF.text, forKey:"userName");
        //if iOS8 before need:
        userDefaults.synchronize();
    




其他视图控制器:

import UIKit

class OtherViewController: UIViewController 

    @IBOutlet weak var userNameLabel: UILabel!

    override func viewDidLoad() 
        super.viewDidLoad()
        let userDefaults = NSUserDefaults.standardUserDefaults();
        //get the userName from NSUserDefaults
        self.userNameLabel.text = userDefaults.objectForKey("userName") as? String;

    

【讨论】:

谢谢你,请问有快速版本吗? 谢谢,如何使用 userDefaults 填充 tableviewcell?

以上是关于使用 IBAction 将数据传递到另一个视图控制器而无需 segue swift的主要内容,如果未能解决你的问题,请参考以下文章

Extjs 7,如何使用视图模型将动态数据从一个控制器传递到另一个控制器

将数据从视图控制器传递到另一个视图控制器

如何使用 post 方法将 JSON 数据从登录功能传递到另一个视图控制器?

将标签数据从表视图传递到另一个视图控制器

将 ImageData 从一个视图控制器传递到另一个视图控制器

如何将数据从表视图传递到另一个视图控制器