Ios 当我更改视图时,为什么我的按钮首选项/参数会重置?
我有一个iOS应用程序,其中tableview中单元格的值用于设置UIButtons上的首选项/参数 当按下按钮时,我会将标签ID发送到tableview,当用户按下单元格时,它会收集文本和图像,并将其(连同标签ID)返回到主视图Ios 当我更改视图时,为什么我的按钮首选项/参数会重置?,ios,swift,uiview,uiviewcontroller,uibutton,Ios,Swift,Uiview,Uiviewcontroller,Uibutton,我有一个iOS应用程序,其中tableview中单元格的值用于设置UIButtons上的首选项/参数 当按下按钮时,我会将标签ID发送到tableview,当用户按下单元格时,它会收集文本和图像,并将其(连同标签ID)返回到主视图 这成功地使用相应的按钮标签ID更改了按钮上的参数,但当我现在按下一个新按钮执行相同的过程时,它会重置第一个按钮更改(清除图像和文本),并仅将更改应用于按下的新按钮 这是主视图控制器类: class ViewController: UIViewController {
这成功地使用相应的按钮标签ID更改了按钮上的参数,但当我现在按下一个新按钮执行相同的过程时,它会重置第一个按钮更改(清除图像和文本),并仅将更改应用于按下的新按钮 这是主视图控制器类:
class ViewController: UIViewController {
var recievedItem: ChosenItem?
var imageToButton: UIImage?
@IBOutlet weak var button1: UIButton!
@IBOutlet weak var button2: UIButton!
@IBOutlet weak var button3: UIButton!
func AddNew() {
performSegueWithIdentifier("addNew", sender: nil)
}
@IBAction func loadItem(sender: UIButton!) {
performSegueWithIdentifier("itemList", sender: sender)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "itemList"){
let tableViewController : TableViewController = segue.destinationViewController as! TableViewController
tableViewController.buttonTag = sender!.tag
}
}
@IBAction func play(sender: UIButton) {
print("Jeg har fått \(recievedItem!.chosenWord)")
}
override func viewDidLoad() {
super.viewDidLoad()
self.navigationController?.navigationBar.setBackgroundImage(UIImage(), forBarMetrics: .Default)
self.navigationController?.navigationBar.shadowImage = UIImage()
self.navigationController?.navigationBar.translucent = true
navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Open", style: .Plain, target: self, action: "AddNew")
navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "AddNew")
if(recievedItem != nil){
imageToButton = UIImage(data: recievedItem!.chosenImage)
switch recievedItem!.chosenButton{
case 0:
button1.setBackgroundImage(imageToButton, forState: .Normal)
button1.setTitle(recievedItem!.chosenWord, forState: .Normal)
case 1:
button2.setBackgroundImage(imageToButton, forState: .Normal)
button2.setTitle(recievedItem!.chosenWord, forState: .Normal)
case 2:
button3.setBackgroundImage(imageToButton, forState: .Normal)
button3.setTitle(recievedItem!.chosenWord, forState: .Normal)
default:
print("No buttonTag recieved")
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
这是tableview类:
class TableViewController: UITableViewController {
var words = [Words]()
var chosenItem: ChosenItem!
var buttonTag: Int!
override func viewDidLoad() {
super.viewDidLoad()
let appDel: AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate)
let context: NSManagedObjectContext = appDel.managedObjectContext
let request = NSFetchRequest(entityName: "Words")
request.returnsObjectsAsFaults = false
do {
words = try context.executeFetchRequest(request) as! [Words]
} catch {
print("Unresolved error")
abort()
}
print("Her er også button tag \(buttonTag)")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.words.count
}
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
let cell = self.tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
let itemWord = self.words[indexPath.row]
cell.textLabel?.text = itemWord.word
cell.imageView?.image = UIImage(data: itemWord.image!)
return cell
}
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print(self.words[indexPath.row].word!)
chosenItem = ChosenItem()
chosenItem.chosenButton = buttonTag
chosenItem.chosenWord = self.words[indexPath.row].word!
chosenItem.chosenImage = self.words[indexPath.row].image!
performSegueWithIdentifier("backToMain", sender: chosenItem)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "backToMain"){
let mainViewController : ViewController = segue.destinationViewController as! ViewController
let data = sender as! ChosenItem
mainViewController.recievedItem = data
}
}
}
这是保存数据的模型类:
class ChosenItem: NSObject {
var chosenButton: Int!
var chosenWord: String!
var chosenImage: NSData!
}
问题在于这一行:
performSegueWithIdentifier("backToMain", sender: chosenItem)
这不是您从推送或呈现的视图控制器返回到推送或呈现它的视图控制器的方式!您正在做的是创建一个全新的视图控制器,这就是为什么未设置所选按钮的原因;它是一个具有不同选择按钮的不同视图控制器,即“无”,因为此视图控制器刚刚存在
这不仅会把所选按钮弄得一团糟,而且最终你的应用程序会崩溃,因为你每次前进和后退都会在另一个视图控制器上创建一个视图控制器,最终你会耗尽内存
从推送的视图控制器返回的方法是popViewController
。从显示的视图控制器返回的方法是dismissViewController
如果你知道自己在做什么,你可以改为使用一种特殊的非音程音程音程,称为“放松音程”,但听起来你还没有做好准备。“当我现在按下一个新按钮来执行相同的程序”什么按钮,什么程序?@matt有三个不同的按钮。如果按下这些按钮中的任何一个,它将转到tableView并传递按下的按钮标记值。我使用标签值来知道按下了什么按钮。当按下单元格时,它会切换回主视图,并更改按下的按钮背景图像和文本。这就是“程序”。当我对其他按钮之一重复此操作时,第一个按钮将重置回默认值。更清楚吗?听起来像问题所在的“它回到了主视图”。你不能“返回”到主视图。啊!所以当我继续时,我会创建一个新的视图并将其放在现有视图的顶部?所以我就把它们堆在一起?但是当我使用popViewController时,我会一起从堆栈中删除视图吗?无论如何,当我再次转到主视图时,我已经使用viewDidLoad()从模型中获取了数据。当我使用popviewController时是否有调用的som函数?弹出的视图控制器将获得
视图将消失:
,因此它可以将任何信息移交给另一个视图控制器(仍然存在)。或者,正如我已经说过的那样,您可以执行一个放松序列,在这种情况下,您可以使用prepareforsgue:
。