为啥 UILable 在从另一个页面传递值之前不会显示?

Posted

技术标签:

【中文标题】为啥 UILable 在从另一个页面传递值之前不会显示?【英文标题】:Why the UILable will not show up before passing the value from another page?为什么 UILable 在从另一个页面传递值之前不会显示? 【发布时间】:2017-07-10 10:15:03 【问题描述】:

我是 swift 新手,在尝试构建应用程序时遇到了一些问题。 当我尝试将值从视图 A 传递到视图 B 时(但应用程序将首先访问视图 B),来自 B 的标签将不会显示。但是,如果我从视图 B 转到视图 A 并更新视图 A 中的值,然后返回视图 B,则视图 B 中的值将被更新。为什么会这样?

还有一个问题,从视图 A 和 B 更改的值在注销/返回另一个视图后将不会保留。即使我注销/切换到另一个视图,如何保留更改?

谢谢大家!这是我的代码。

类视图 B

@IBOutlet weak var num_1: UILabel!
@IBOutlet weak var num_2: UILabel!

var labeltext = String()

override func viewDidLoad() 
    super.viewDidLoad()
    num_1.text = labeltext


@IBAction func topic1(sender: AnyObject) 
    self.performSegueWithIdentifier("contentView", sender: self)

类视图 A

override func viewDidAppear(animated: Bool)


let isUserLoggedIn = NSUserDefaults.standardUserDefaults().boolForKey("isUserLoggedIn");

if(!isUserLoggedIn)

     self.performSegueWithIdentifier("loginView", sender: self);






@IBAction func logoutButtonTapped(sender: AnyObject) 

    NSUserDefaults.standardUserDefaults().setBool(false,forKey:"isUserLoggedIn");
    NSUserDefaults.standardUserDefaults().synchronize();

    let loginViewController = self.storyboard!.instantiateViewControllerWithIdentifier("loginView") as! LoginViewController
    let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate

    appDelegate.window?.rootViewController = loginViewController
    appDelegate.window?.makeKeyAndVisible()

  //  self.performSegueWithIdentifier("loginView", sender: self);




@IBOutlet weak var voteNum1: UILabel!
@IBOutlet weak var voteNum2: UILabel!
@IBOutlet weak var centerCircle: UIImageView!

var num1 = 0.0
var num2 = 0.0
var sum = 0.0
var a = 0.0
var b = 0.0
let circleShape = CAShapeLayer()

@IBAction func vote1(sender: AnyObject) 
    num1 = Double(voteNum1.text!)!
    self.voteNum1.text = String(num1 + 1)
    a = num1 + 1



@IBAction func vote2(sender: AnyObject) 
    num2 = Double(voteNum2.text!)!
    self.voteNum2.text = String(num2 + 1)
    b = num2 + 1


@IBAction func calculate(sender: AnyObject) 
    sum = Double(a/(b+a))
    circleShape.strokeEnd = CGFloat(sum)


override func viewDidLoad() 
    super.viewDidLoad()
    // round view
    let roundView = UIView(frame: CGRectMake(85, 100, 150, 150))
    roundView.backgroundColor = UIColor.whiteColor()
    roundView.layer.cornerRadius = roundView.frame.size.width / 2

    // bezier path
    let circlePath = UIBezierPath(arcCenter: CGPoint (x: roundView.frame.size.width / 2, y: roundView.frame.size.height / 2),
                                  radius: roundView.frame.size.width / 2.2 ,
                                  startAngle: CGFloat(-0.5 * M_PI),
                                  endAngle: CGFloat(1.5 * M_PI),
                                  clockwise: true)
    // circle shape
    circleShape.path = circlePath.CGPath
    circleShape.strokeColor = UIColor.blackColor().CGColor
    circleShape.fillColor = UIColor.clearColor().CGColor
    circleShape.lineWidth = 14
    // set start and end values
    circleShape.strokeStart = 0.0
    circleShape.strokeEnd = CGFloat(sum)

    // add sublayer
    roundView.layer.addSublayer(circleShape)
    // add subview
    self.view.addSubview(roundView)
    self.view.insertSubview(roundView, belowSubview: centerCircle)



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    var DestViewController : View B = segue.destinationViewController as! View B

    DestViewController.labeltext = voteNum1.text!


@IBAction func back(sender: AnyObject) 
        self.performSegueWithIdentifier("back", sender: self)

【问题讨论】:

您好,感谢您的回复。我希望在我从视图 A 传递值之前显示视图 B 中的 UILabel (num_1)。 此外,我希望即使我切换到另一个页面(例如从A切换到B,A中的voteNum1保持不变),也可以存储之前更新的值(num_1,num_2,voteNum1,voteNum2)。现在,它每次都会返回 0。)或注销。 所以基本上你想存储这里的值有两种情况。 1. 然而,从长远来看,应用会被杀? 2.对于整个app的临时运行 谢谢。它需要长期储存。有什么建议吗? 所以基本上,如果您有大量数据,那么您必须使用如下给出的答案的数据库,如果您有较小的数据,例如用户信息,您可以使用用户默认值来存储值。 【参考方案1】:

你视图中的线 b;

num_1.text = labeltext

每次都实例化一个新字符串。

换行

var labeltext = String()

var labelText : String? = nil

要在退出后保留数据,您需要在应用中开发“持久性”。本质上,您需要在应用程序中嵌入持久的数据存储。

这样做的流行方法是;

核心数据 领域*

*https://realm.io

https://realm.io/docs/swift/latest/

【讨论】:

感谢您的回复。但是在我将行替换为 var labelText : String? = nil 当我运行应用程序时,UIlabel(num_1) 仍然没有在第一次出现。

以上是关于为啥 UILable 在从另一个页面传递值之前不会显示?的主要内容,如果未能解决你的问题,请参考以下文章

内核模块,在从一个进程调用时,从另一个进程写入页面

Vue.js 模态窗口在从另一个组件单击时未打开

如何在从另一个小部件继承的小部件中设置数据?

为啥传递给函数的协议默认值不会改变,即使函数在子类化时会改变?

为啥在 vuejs2 中我的默认道具没有传递给我的子组件?

为啥挂起的意图在从服务的通知中调用时不会启动活动