2016-10-08 3 views
0

У меня есть вид контейнера внутри контроллера просмотра. Когда пользователь нажимает кнопку, отображается Container View, но текст в представлении контейнера основан на кнопке, нажатой пользователем. Для этого мне нужно обновить Container View, но я не уверен, как это сделать.Обновление содержимого в контейнере

Это мой Container View Code:

override func viewDidLoad() { 
     super.viewDidLoad() 

     Cancel_Button.hidden = true 
     Save_Button.hidden = true 

     let Storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let ViewController: View = Storyboard.instantiateViewControllerWithIdentifier("View") as! View 
     Title_String = ViewController.String 
     Title_Label.text = Title_String 
    } 

И это код в моем View Controller:

@IBOutlet var View_Controller_Popup: UIView! 
var String = String() 

override func viewDidLoad() { 
     super.viewDidLoad() 


     View_Controller_Popup.hidden = true 
    } 

@IBAction func Button_Pressed(sender: AnyObject) { 
     let Storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
     let ViewController: ContainerView = Storyboard.instantiateViewControllerWithIdentifier("Container") as! ContainerView 
     self.String = "Specific Title" 
     ViewController.Title_String = self.String 
     self.View_Controller_Popup.hidden = false 
    } 

Так как я перезагрузить контейнера View, чтобы при нажатии кнопки , представление контейнера отображается с текстом меток на основе нажатой кнопки.

Update:

Поскольку некоторые люди не могут понять этот вопрос я, имеющий я перефразировать проблему с изображениями.

Это мой Вид:

Изображений были удалены

Как вы можете видеть, что есть много кнопок (с иконками). Когда пользователь нажимает кнопку, я хочу, чтобы в виде контейнера отображалась информация:

Так что для каждой кнопки текст ярлыка должен быть другим. Но в настоящее время в приложении строка пуста, поэтому текст метки не заполнен:

Я считаю, что это потому, что я не обновляю код в представлении контейнера, и поэтому строка по-прежнему пуста.

Таким образом, проблема заключается в том, что представление контейнера не отображает метку заголовка правильно, и я думаю, что это связано с тем, что не обновляется представление контейнера, но я фактически не знаю, как обновить представление контейнера.

+0

Если вы используете раскадровку, то вы можете установить содержащийся контроллер представления используя встроенный сегмент. В вашем содержащем ViewController вы можете получить ссылку на встроенный контроллер представления в 'prepareForSegue' и искать встроенный сегмент. Как только вы храните ссылку в свойстве, вы можете вызывать функции на нем в любое время. – Paulw11

+0

Я использую раскадровку, не могли бы вы показать мне, как это сделать в коде? –

ответ

0

Я не совсем уверен, что вы просите, но я попытаюсь ответить. Дайте мне знать, если я не понимаю.

Ключ здесь действительно просто ваша архитектура. Я предлагаю иметь уникальные методы действий для каждой кнопки. Это будет выглядеть примерно так:

@IBAction func ButtonOnePressed(sender: AnyObject) { 
    initializeContainerView(withTitle: "Button One Title") 
} 

@IBAction func ButtonTwoPressed(sender: AnyObject) { 
    initializeContainerView(withTitle: "Button Two Title") 
} 

func initializeContainerView(withTitle title: String) { 
    let Storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let ViewController: ContainerView = Storyboard.instantiateViewControllerWithIdentifier("Container") as! ContainerView 
    ViewController.Title_String = title 
    self.View_Controller_Popup.hidden = false 
} 

Однако, если вы предпочитаете/требовать, используя тот же метод действия между кнопками, добавлять метки к кнопкам UIButton.tag. Затем просто используйте оператор switch в вашем методе действий, чтобы проверить sender.tag и запустить код для этого случая.Это будет выглядеть примерно так:

@IBAction func Button_Pressed(sender: AnyObject) { 
    switch sender.tag { 
    case buttonOneTagValue: 
     initializeContainerView(withTitle: "Button One Title") 
    case buttonTwoTagValue: 
     initializeContainerView(withTitle: "Button Two Title") 
    default: 
     break 
} 

func initializeContainerView(withTitle title: String) { 
    let Storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil) 
    let ViewController: ContainerView = Storyboard.instantiateViewControllerWithIdentifier("Container") as! ContainerView 
    ViewController.Title_String = title 
    self.View_Controller_Popup.hidden = false 
} 
+0

Я пробовал ваш код и другой код, но я чувствую, что вы неправильно поняли вопрос. См. Мой обновленный вопрос. –

+0

Вы можете попробовать обновить вид контейнера с помощью ViewController .view.setNeedsDisplay() Вы можете поместить эту строку в 'initializeContainerView' в качестве последней строки. –

+0

Нет, это все еще не работает. –

0

В вашем initializeContainerView метод, изменения:

self.Day_Period_String = title 
ViewController.Title_String = self.Day_Period_String 

к:

ViewController.Title_String = title 

И в контейнере View Controller, удалите:

Title_String = ViewController.Day_Period_String 

И наконец изменить эту строку:

var Title_String = String() 

к:

var Title_String: String! 

Если это не работает, я буду у вас добавить несколько строк печати. К сожалению, я обновил XCode 8 (и, следовательно, Swift 3), поэтому не могу запустить ваш код.

+0

Итак, я добавил несколько отпечатков вокруг кода, и кажется, что текст ярлыка задан правильно, но не отображается. Таким образом, строка заголовка не пуста, текст метки не пуст, но при добавлении этого текста: .text = Title_String + «Тестирование» отображается только «Тестирование». Так что метка не обновляется правильно? –

+0

Хм. Именно поэтому я предлагал использовать setNeedsDisplay, так как казалось, что ваши данные были установлены правильно, так как это должно заставить пользовательский интерфейс обновляться. Может быть, ваша ширина UILabel слишком мала и, следовательно, не отображает текст? Одним из способов подтверждения этого является печать ширины UILabel или добавление строки после инициализации и обновления текста для обеспечения соответствия размера текста: Title_Label.sizeToFit() –

+0

Но он отображает текст, а не текст, который я хочу, но при печати этикетки на консоль печатается то, что я хочу напечатать. –

0

попробовать с помощью протокола делегата вашего containerView должен расширить протокол делегата родительского, а просто реализовать функцию с аргументами функа updateContent (ID: Int)

protocol ContentDelegate { 
    func updateContent(id: Int) 
} 

class ParentViewController: UIViewController { 
    var delegate: ContentDelegate? 

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 

     if (segue.identifier == "containerController") { 
      let containerVC = segue.destination as! ChildContainerViewController 

      self.delegate = containerVC 
     }   
    } 
} 

class ChildContainerViewController: UIViewController, ContentDelegate { 
    func updateContent(id: Int) { 
    // your code 
    } 
} 
Смежные вопросы