Как сделать push-седж при выборе UITableViewCell
У меня есть список эффектов в представлении таблицы. Я создал верхнюю правую кнопку бара, которая делает push-сегу в другом контроллере представления, что помогает создать новый эффект. Теперь я хочу добавить push segues в ячейки представления таблицы, чтобы значения эффектов, возможно, были загружены в контроллер представления эффектов эффектов, и я могу сохранить отредактированные значения.
Вопрос в том, можно ли программно создать push-сегу? Если нет, я могу передать эффект через prepareforsegue
? Если я попытаюсь использовать prepareforsegue
, я столкнулся с проблемой, при которой перетаскивание элемента управления из UITableView
не позволяет мне создавать push-сегу в контроллер представления эффектов.
Ответы
Ответ 1
control перетащить из контроллера View для просмотра контроллера
![From View Controller to View Controlle!]()
Вам нужно указать идентификатор вашего сегмента:
![enter image description here]()
Выполните команду segue:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"yourSegue" sender:self];
}
Теперь вот что, это просто выполнит segue, если вам когда-нибудь понадобится передать некоторые данные этому контроллеру. Затем вы должны реализовать следующий делегат segue:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Make sure your segue name in storyboard is the same as this line
if ([[segue identifier] isEqualToString:@"yourSegue"])
{
//if you need to pass data to the next controller do it here
}
}
Ответ 2
Вот еще один вариант, который не требует использования didSelectRowAtIndexPath.
Вы просто подключаете segue в Interface Builder от ячейки прототипа до места назначения.
Оттуда вы можете просто:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "AffiliationDetail", let destination = segue.destinationViewController as? AffiliateDetailViewController {
if let cell = sender as? UITableViewCell, let indexPath = tableView.indexPathForCell(cell) {
var affiliation = affiliations[indexPath.row]
destination.affiliation = affiliation
}
}
}
Ответ 3
Swift
Этот ответ показывает, как передавать данные и обновляется для Xcode 8 и Swift 3.
Вот как настроить проект.
- Создайте проект с
TableView
. См. здесь для простого примера.
- Добавьте второй
ViewController
.
- Управлять перетаскиванием из первого контроллера представления с видом таблицы на второй контроллер представления. Выберите "Показать" как тип сегмента.
![введите описание изображения здесь]()
- Нажмите кнопку segue в раскадровке, а затем в Инспекторе атрибутов введите идентификатор "yourSegue". (Вы можете называть его так, как хотите, но вам также нужно использовать одно и то же имя в коде.)
![введите описание изображения здесь]()
- (Необязательно) Вы можете встроить все в контроллер навигации, выбрав первый контроллер представления в раскадровке и выбрав Редактоp > Вставить в > Контроллер навигации.
Код
Первый вид контроллера с TableView:
import UIKit
class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
// ...
// method to run when table view cell is tapped
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
// Segue to the second view controller
self.performSegue(withIdentifier: "yourSegue", sender: self)
}
// This function is called before the segue
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
// get a reference to the second view controller
let secondViewController = segue.destination as! SecondViewController
// set a variable in the second view controller with the data to pass
secondViewController.receivedData = "hello"
}
}
Второй контроллер просмотра
class SecondViewController: UIViewController {
@IBOutlet weak var label: UILabel!
// This variable will hold the data being passed from the First View Controller
var receivedData = ""
override func viewDidLoad() {
super.viewDidLoad()
print(receivedData)
}
}
Для более простого примера о передаче данных между диспетчерами просмотра см. этот ответ.
Ответ 4
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
[self performSegueWithIdentifier:@"YourPushSegueName" sender:self];
}
Ответ 5
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MyViewController *myVController = (MyViewController *)[self.storyboard instantiateViewControllerWithIdentifier:@"StoryBordIdentifier"];
[self.navigationController pushViewController:myVController animated:YES];
}
Ответ 6
У вас есть 2 варианта: ctrl + перетащить из ячейки прототипа в новый vc, а затем вы перейдете из каждой ячейки, и вам нужно будет выполнить подготовку к segue.
Второй вариант, в didselectrowatindexpath вы можете создать экземпляр вашего нового контроллера представлений с помощью self.storyboard instantiateviewcontrollerwithidentifier..., затем вызвать pushviewcontroller или presentviewcontroller, вам не нужны segues в раскадровке или подготовиться к segue в этом сценарии.
Ответ 7
Вы можете использовать этот метод:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
Вы можете выполнять функцию выбора определенной ячейки таблицы.
Ответ 8
Вы можете сделать это, выполнив следующие методы:
Во-первых, вам нужно импортировать другой контроллер представления в текущий вид.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {}
внутри метода выше вы должны вызвать метод
- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated;
следующим образом:
yourViewController = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil];
[self.navigationController YourViewController animated:YES];
Таким образом, вы можете достичь push-сегмента при выборе UITableViewCell
.
Надеюсь, это поможет вам...!
Ответ 9
Swift 3
После ответа Ahmed Daou answer → вручную перетащите segue из vc в vc в раскадровку
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.performSegue(withIdentifier: "SegueIdentifier", sender: nil)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "SegueIdentifier" {
//do something you want
}
}