Passing data to another view controller in swift 3 - swift3

How do I send coredata values when selecting a row in table view to another view controller using SHOW SEGUE in swift 3?
This is my code in objective c using Present Modally Segue and I want the equivalent of that code in swift 3 using Show Segue because I'm using a navigation controller. I've been working on this for a couple hours but as of now, I still haven't been able to do it.
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([[segue identifier] isEqualToString:#"UpdateDevice"])
{
NSManagedObject *selectedDevice = [self.accounts objectAtIndex:[[self.tableView indexPathForSelectedRow] row]];
detailViewController *destViewController = segue.destinationViewController;
destViewController.account = selectedDevice;
}
}

Related

SwiftUI Using on Receive with #FetchRequest Publisher

I try to observe the changes in #FetchRequest publisher by using onReceive as shown in the code bellow, It's work but I have on issue I want to fix it, the publisher publish to many values and I just want to receive one value to know the change in #FetchRequest is happened.
Example Code
struct TodayView: View {
#FetchRequest(fetchRequest: TodoTaskManager.allOverdueTasksFetchRequest)
private var overdueTasks: FetchedResults<TodoTask>
// Some views...
.onReceive(overdueTasks.publisher.count()) { _ in
print("tasks count: \(overdueTasks.count)") // The print times equals tasks count x 2
}
}

SwiftUI picker save return object

I have a background in .NET backend and I have decided to learn swift.
It is going very well, but I have a few issues in SwiftUI.
My problem right now is with the picker.
My goal is to pick an item from the picker, return the object and save the object in a variable, so I can post it to api.
The picker is a list of recipes from API, with: name and ID.
I can populate the picker just fine and get the object back, but I can’t save it.
I got the picker and with the selection I can easy get the name.
But how do I save the full object?
Picker("Pick a recipe", selection: $selectedItem) {
ForEach(recipes, id: \.self) { recipe in
Text(recipe.name)
// var res = recipe - I can’t do that, what do I do then?
}
}

How does the pattern of assigning `#State` in `onReceive` ensure that view state is in sync?

I'm having a little trouble with the following pattern which integrates Combine publishers into SwiftUI so that view state is updated when publishers emit:
struct ItemList: View {
var publisher: AnyPublisher<[Item], Never>
#State private var items = [Item]()
var body: some View {
List(items) { item in
ItemRow(item: item)
}
.onReceive(publisher) {
items = $0
}
}
}
Above example from Swift by Sundell
I feel like I'm missing something when I read it.
Let's assume you initialize items to the correct (at that time) value. What ensures that the published value won't change between the creation of ItemList and the first call to body, where it first starts listening to changes? Or if there is no such guarantee, then what else is preventing the view from ending up in the wrong initial state because of this?
Consider a NavigationLink:
NavigationLink(
destination: { ItemList(publisher: myPub) },
label: { Text("Show List") }
)
Here we have a case where SwiftUI creates the ItemList immediately, but doesn't ask the ItemList for its body until the user taps the link.
(How do we know it creates the ItemList immediately? The destination argument is not declared #escaping, so SwiftUI has to call it inside the NavigationLink initializer.)
So in fact there is a real risk in this case that items should change between when the ItemList is created and when it appears on screen.
We solve this by using a publisher like CurrentValueSubject that publishes its current value immediately to each new subscriber. That way, it doesn't matter how much later SwiftUI decides to use the view. As soon as SwiftUI uses the view, it subscribes to the publisher and immediately gets the current value. SwiftUI can handle that update before updating the framebuffer, so the user doesn't see a flash of incorrect data.
We need to read it in sequence:
State is initiailzed, supposing items = [Item1, Item2, Item3]
body is called to render view
List is constructed with current items, ie. List([Item1, Item2, Item3])
onReceive is called on constructed List of 3) and creates view around that list with subscriber to publisher
subscriber requests current events from publisher
if there are events in publisher then onReceive's closure handler is called (see below) otherwise no changes and List of 3) is shown on screen
6.1. if handler gets same initial [Item1, Item2, Item3] (subscriber extracts all available items) then state is not changed and List of 3) is shown on screen
6.2. if handler gets different items [ItemX, ItemY] then state change invalidates view and List is rebuilt with [ItemX, ItemY] which are shown on screen (there is no cycling because refresh is synchronous and we get into 6.1 at second pass).
That's simplified logic of provided code snapshot.

present SwiftUI view from a SKScene

Is it possible to present a SwiftUI view from a SpriteKit scene?
I have various sprites in the game scene. When certain one receive touch data I want a SwiftUI view to pop up.
In the past I have used something like this to present another UI view.
if bloqsLogo.contains(location) {
if instructionsOn == false {
let pop = InstructionsPopUp()
pop.tag = 104
self.view?.addSubview(pop)
instructionsOn = true
} else
if instructionsOn == true {
if let viewWithTag = self.view!.viewWithTag(104) {
viewWithTag.removeFromSuperview()
instructionsOn = false
}else{
print("nah")
}
}
}
My SKScene is an instance of another SwiftUI view and presented there. A good part of my GUI is done in SwiftUI. I am basically wanting to code as much of my App as I can in SwiftUI while keeping the physics and sprites in a SKScene. All of which is going rather well besides this!

iOS 5 Storyboard: NavigationViewController to TabbarController - Not working , Why?

I am using iOS5 with Storyboard and my scenes are like this :
NavigationCOntroller ->(Nav view 1) TableViewController -> TabBarController ->(Tab1)TableViewController
and similarly I more tabs under my TabBarController.
Now I go to Tab1 when user clicks on any row in my TableViewCOntroller and before PerformingSegue I want to send some data to my Tab1(TableViewController) like this
MyTableVController *tvc = segue.destinationViewController;
tvc.selectedObject = currentObject;
[UITabBarController setSelectedObject:]: unrecognized selector sent to instance 0x68c9450
Now why is it assuming that 'MyTableVController' is a UITabBarController and searching for setSelectedObject method ???
And how can I pass data to my TableViewCOntroller in this scenario ?
Thanks.
OK I have found solution to my problem , I did like this
UITabBarController *tabController = (UITabBarController *)segue.destinationViewController;
MyTableVController *tvc = (MyTableVController *)[viewControllers objectAtIndex:0];
And thats how you have your required viewcontroller and pass data to it.