gpt4 book ai didi

ios - UISplitViewController : Can DetailViewController load data from MasterVIewController without segueing back?

转载 作者:行者123 更新时间:2023-11-29 05:49:18 24 4
gpt4 key购买 nike

这里是业余爱好者。我使用 UISplitViewController 创建了一个 iOS Swift 应用程序。到目前为止效果很好。我希望能够在查看 DetailViewController View 时加载存储在 MasterViewController 中的数据,而无需返回到 MasterViewContoler View 并选择其中显示的 UITableView 中的项目。唷,真是拗口,我希望这是有道理的。这可能吗?我不知道如何继续。这些图像可能会更好地解释:

Detail View

Master View

我已阅读这些问题:getting the MasterViewController from the DetailViewController in a UISplitViewController appSplitView - reload data in master tableView based on detail changed in swift但它们并不完全是我想要的。

这是我的 DetailViewController 代码:

import UIKit
import SafariServices

class DetailViewController: UIViewController {

@IBOutlet weak var scrollView: UIScrollView!

@IBOutlet weak var stackView: UIStackView!

@IBOutlet weak var detailDescriptionLabel: UILabel!

@IBOutlet weak var compareToButton: UIButton!

@IBAction func compareToButtonTapped(_ sender: Any) {
//do something here?
}


@IBOutlet weak var pathologyImageViewOne: UIImageView!

@IBOutlet weak var pathologyImageViewTwo: UIImageView!

@IBOutlet weak var detailUsedLabel: UILabel!

@IBOutlet weak var detailReferenceLabel: UILabel!

@IBOutlet weak var detailPhotoOneCaptionLabel: UILabel!

@IBOutlet weak var detailPhotoTwoCaptionLabel: UILabel!

var caseIDOne = 0
var caseIDTwo = 0
var compareToButtonString = "Hello"


func configureView() {
// Update the user interface for the detail item.
if let detail = detailItem {
if let detailDescriptionLabel = detailDescriptionLabel,
let compareToButton = compareToButton,
let detailUsedLabel = detailUsedLabel,
let pathologyImageViewOne = pathologyImageViewOne,
let pathologyImageViewTwo = pathologyImageViewTwo,
let detailReferenceLabel = detailReferenceLabel,
let detailPhotoOneCaptionLabel = detailPhotoOneCaptionLabel,
let detailPhotoTwoCaptionLabel = detailPhotoTwoCaptionLabel {

title = detail.name
caseIDOne = detail.caseIDOne
caseIDTwo = detail.caseIDTwo!

detailDescriptionLabel.text = detail.description
compareToButtonString = detail.compareTo!

UIView.performWithoutAnimation {
compareToButton.setTitle("\(compareToButtonString)", for: .normal)
}

detailUsedLabel.text = detail.used
detailReferenceLabel.text = detail.reference

pathologyImageViewOne.image = UIImage(named: detail.photoOne)
pathologyImageViewOne.layer.cornerRadius = 4
pathologyImageViewOne.contentMode = .scaleAspectFill
pathologyImageViewOne.clipsToBounds = true

pathologyImageViewTwo.image = UIImage(named: detail.photoTwo!)
pathologyImageViewTwo.layer.cornerRadius = 4
pathologyImageViewTwo.contentMode = .scaleAspectFill
pathologyImageViewTwo.clipsToBounds = true

// The image in the foreground
let frontImage = UIImage(named: "tap-icon")
// Create the view holding the image
let frontImageViewOne = UIImageView(image: frontImage)
// The size and position of the front image
frontImageViewOne.frame = CGRect(x: 0 , y: 0, width: 34, height: 42)
// turn off AutoresingMask
frontImageViewOne.translatesAutoresizingMaskIntoConstraints = false

// change alpha
frontImageViewOne.alpha = 0.8

// Create the view holding the image again
let frontImageViewTwo = UIImageView(image: frontImage)
// The size and position of the front image again
frontImageViewTwo.frame = CGRect(x: 0 , y: 0, width: 34, height: 42)
// turn off AutoresingMask again
frontImageViewTwo.translatesAutoresizingMaskIntoConstraints = false

// change alpha again
frontImageViewTwo.alpha = 0.8



//MARK: Image One
// Add the front image on top of the background
pathologyImageViewOne.addSubview(frontImageViewOne)

NSLayoutConstraint.activate([
//place the tap icon at the bottom right of parent
frontImageViewOne.bottomAnchor.constraint(equalTo: pathologyImageViewOne.bottomAnchor, constant: -10),
frontImageViewOne.centerXAnchor.constraint(equalTo: pathologyImageViewOne.rightAnchor, constant: -24)
])


let tapGestureRecognizerOne = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizerOne:)))
pathologyImageViewOne.isUserInteractionEnabled = true
pathologyImageViewOne.addGestureRecognizer(tapGestureRecognizerOne)

//MARK: Image two
// Add the front image on top of the background
pathologyImageViewTwo.addSubview(frontImageViewTwo)

NSLayoutConstraint.activate([
//place the tap icon at the bottom right of parent
frontImageViewTwo.bottomAnchor.constraint(equalTo: pathologyImageViewTwo.bottomAnchor, constant: -10),
frontImageViewTwo.centerXAnchor.constraint(equalTo: pathologyImageViewTwo.rightAnchor, constant: -24)
])


let tapGestureRecognizerTwo = UITapGestureRecognizer(target: self, action: #selector(imageTapped(tapGestureRecognizerTwo:)))
pathologyImageViewTwo.isUserInteractionEnabled = true
pathologyImageViewTwo.addGestureRecognizer(tapGestureRecognizerTwo)

detailPhotoOneCaptionLabel.text = detail.photoOneCaption

detailPhotoTwoCaptionLabel.text = detail.photoTwoCaption

}
}
}

override func viewDidLoad() {
super.viewDidLoad()


configureView()

stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.layoutMargins = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16)
stackView.isLayoutMarginsRelativeArrangement = true
scrollView.addSubview(stackView)

stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
stackView.topAnchor.constraint(equalTo: self.scrollView.topAnchor).isActive = true
stackView.bottomAnchor.constraint(equalTo: self.scrollView.bottomAnchor).isActive = true


}

var detailItem: Descriptor? {
didSet {
// Update the view.
configureView()
}
}


func showWebsite(_ whichCase: Int) {
if let url = URL(string: "https://digitalpathology.uct.ac.za/case_detail.php?case_id=\(whichCase)") {
let config = SFSafariViewController.Configuration()
config.entersReaderIfAvailable = true

let vc = SFSafariViewController(url: url, configuration: config)
present(vc, animated: true)
}
}



@objc func imageTapped(tapGestureRecognizerOne: UITapGestureRecognizer)
{

showWebsite(caseIDOne)
print("Image tapped")
print("CaseOne ID = \(caseIDOne)")
}

@objc func imageTapped(tapGestureRecognizerTwo: UITapGestureRecognizer)
{

showWebsite(caseIDTwo)
print("Image tapped")
print("CaseTwo ID = \(caseIDTwo)")
}


}

我编辑的(为了简洁)MasterViewController 代码:

import UIKit

class MasterViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

@IBOutlet weak var tableView: UITableView!

@IBOutlet weak var searchFooter: SearchFooter!

var detailViewController: DetailViewController? = nil

var descriptors = [Descriptor]()

var filteredDescriptors = [Descriptor]()

let searchController = UISearchController(searchResultsController: nil)

fileprivate var collapseDetailViewController = true

// MARK: - view setup
override func viewDidLoad() {
super.viewDidLoad()

// Setup the Search Controller
searchController.searchResultsUpdater = self
searchController.obscuresBackgroundDuringPresentation = false
searchController.searchBar.placeholder = "Search Descriptors"
navigationItem.searchController = searchController

definesPresentationContext = true

//delagate and data source commented out, connected in storyboard
//tableView.delegate = self
//tableView.dataSource = self

// The data
descriptors = [
Descriptor(name:"Friable", description:"Easily crumbled. Said of tissue that readily tears, fragments, or bleeds when gently palpated or manipulated.", photoOne: "Friable", photoOneCaption:"Subacute bacterial edocarditis", used:"Used in relation to – heart valve vegetations, brittle carcinomatous tissue esp. of cervix.", reference: "Ref: DMD", caseIDOne:769),
Descriptor(name:"Hypertrophic / Hypertrophied", description:"An enlarged, overgrown or bulky organ or part, on account of an increase in the size of its cells (compare ‘hyperplastic’).", compareTo: "Hyperplastic", photoOne: "Hypertrophic1", photoOneCaption:"The heart in hypertension", photoTwo: "Hypertrophic2", photoTwoCaption:"The heart in hypertension", used:"Used in relation to – over-exercised muscles or muscular organs such as heart, bladder, stomach.", reference: "Ref: FPMD", caseIDOne:833, caseIDTwo:833),
Descriptor(name:"Hyperplastic", description:"An enlarged or expanded organ or part, on account of an increase in the formation and number of normal cells (compare ‘hypertrophy’). Hyperplastic expansion may be uniform or nodular.", compareTo: "Hypertrophy", photoOne: "Hyperplastic", photoOneCaption:"Hyperplastic gastropathy in Zollinger-Ellison syndrome", used:"Used in relation to - a benign expansion of the prostate, an endo- or epithelium, lymph node, gums or endocrine glands, usually reflecting hyper-stimulation of some cause.", reference: "Ref: MKEDMNAH", caseIDOne:555),]

if let split = splitViewController {
let controllers = split.viewControllers
detailViewController = (controllers[controllers.count-1] as! UINavigationController).topViewController as? DetailViewController
}
//splitViewController?.delegate = self as? UISplitViewControllerDelegate
splitViewController?.delegate = self

}

override func viewWillAppear(_ animated: Bool) {

if splitViewController!.isCollapsed {
if let selectionIndexPath = self.tableView.indexPathForSelectedRow {
self.tableView.deselectRow(at: selectionIndexPath, animated: animated)
}
}



//lets sort the array of objects so A comes before Z
descriptors.sort { $0.name.compare($1.name) == .orderedAscending }
self.tableView.reloadData()

super.viewWillAppear(animated)
}


// MARK: - Segues

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


if segue.identifier == "showDetail" {
if let indexPath = tableView.indexPathForSelectedRow {
let descriptor: Descriptor
if isFiltering() {
descriptor = filteredDescriptors[indexPath.row]
} else {
descriptor = descriptors[indexPath.row]
}
let controller = (segue.destination as! UINavigationController).topViewController as! DetailViewController
controller.detailItem = descriptor

collapseDetailViewController = false

controller.navigationItem.leftBarButtonItem = splitViewController?.displayModeButtonItem
controller.navigationItem.leftItemsSupplementBackButton = true

let backItem = UIBarButtonItem()
backItem.title = "Pathology A-Z"
navigationItem.backBarButtonItem = backItem
}
}
}

// MARK: - Table View
func numberOfSections(in tableView: UITableView) -> Int {
return 1
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if isFiltering() {
searchFooter.setIsFilteringToShow(filteredItemCount: filteredDescriptors.count, of: descriptors.count)
return filteredDescriptors.count
}
searchFooter.setNotFiltering()
return descriptors.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)

let descriptor: Descriptor
if isFiltering() {
descriptor = filteredDescriptors[indexPath.row]
} else {
descriptor = descriptors[indexPath.row]
}
cell.textLabel!.text = descriptor.name
cell.detailTextLabel!.text = descriptor.description
return cell
}

func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
// Return false if you do not want the specified item to be editable.
return false
}

extension MasterViewController: UISplitViewControllerDelegate {

func splitViewController(_ splitViewController: UISplitViewController, collapseSecondary secondaryViewController: UIViewController, onto primaryViewController: UIViewController) -> Bool {
return collapseDetailViewController
}
}

最佳答案

您应该为默认情况准备一个方法。比如说,在 DetailViewController 中声明 detailDefaultItem 并在 configureView() 之前在 viewDidLoad 中分配给 detailItem code> (只需删除它,因为它已经在 detailItemdidSet 中调用):

override func viewDidLoad() {
super.viewDidLoad()


var detailDefaultItem = Descriptor()
// set/configure needed default values in `Descriptor` class or here below
// detailDefaultItem.property = someValue
// ...
detailItem = detailDefaultItem
// configureView()
...
}

关于ios - UISplitViewController : Can DetailViewController load data from MasterVIewController without segueing back?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55845923/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com