Post

Replies

Boosts

Views

Activity

Reply to Publishers.CombineLatest in SwiftUI
I could do something like the following. class ValidateLogin { var good: Bool = false let user: String let pass: String init(user: String, pass: String) { self.user = user self.pass = pass } func validateMe() -> Bool { if user.count > 3 && pass.count > 3 { good = true } return good } } struct ContentView: View { @State var userText: String = "" @State var passText: String = "" @State var canSave: Bool = false var body: some View { ZStack { VStack { TextField("Username", text: $userText) { }.onChange(of: userText) { newValue in let validateLogin = ValidateLogin(user: userText, pass: passText) canSave = validateLogin.validateMe() } SecureField("Password", text: $passText) { }.onChange(of: passText) { newValue in let validateLogin = ValidateLogin(user: userText, pass: passText) canSave = validateLogin.validateMe() } }.padding(.horizontal, 20.0) }.onAppear { //Publishers.CombineLatest($userText, $passText) } } } The code above doesn't involve Combine at all. I want to do it in a Combine way.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Jan ’22
Reply to Horizontal List with NavigationView and NavigationLink
I've solved the problem by having NavigationView before ScrollView like the following. ZStack { VStack { NavigationView { ScrollView(.horizontal, showsIndicators: false) { HStack(alignment: .top, spacing: 0) { ForEach(horizonModels, id: \.self) { model in if model.id == 0 { NavigationLink(model.name) { MenuView0() } .font(.system(size: 20.0)) .padding(.horizontal, 20.0) .foregroundColor(Color.white) } else { NavigationLink(model.name) { MenuView1() } .font(.system(size: 20.0)) .padding(.horizontal, 20.0) .foregroundColor(Color.white) } } } } .frame(height: 40.0) .background(Color.orange) } } } That's kind of odd to me.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Dec ’21
Reply to Sign in with Apple not working on Xcode 13 simulators
I've tested my sample app with Apple Sign In with two simulators. They don't go further after I enter my password. When I tested it for a macOS application two weeks ago, I ended up restarting my iMac. The same is true for an iOS sample that I created at the same time. I had to restart my iPhone. Anyway, in your case, I wouldn't be worried as long as it works on an actual device. Some features simply don't work with the simulator.
Topic: App & System Services SubTopic: General Tags:
Dec ’21
Reply to Using Combine-Future to Fetch Server Data
I guess the following is better. But I'm not completely satisfied. // ViewController // import UIKit import Combine class ViewController: UIViewController { // MARK: - Variables var cancellable: AnyCancellable? private var cancellableSet: Set<AnyCancellable> = [] // MARK: - Life cycle override func viewDidLoad() { super.viewDidLoad() let urlStr = "https://api.github.com/repos/ReactiveX/RxSwift/events" let viewModel = ViewModel(urlStr: urlStr, waitTime: 7.0) viewModel.fetchData(urlText: viewModel.urlStr, timeInterval: viewModel.waitTime) .sink { completion in print("Done!") } receiveValue: { dataModels in print("Count: \(dataModels.count)") } .store(in: &cancellableSet) } } // ViewModel // import UIKit import Combine class ViewModel { var anycancellables = Set<AnyCancellable>() var urlStr: String var waitTime: Double init(urlStr: String, waitTime: Double) { self.urlStr = urlStr self.waitTime = waitTime } func fetchData(urlText: String, timeInterval: Double) -> Future<[DataModel], Error> { return Future<[DataModel], Error> { promise in let url = URL(string: urlText)! var request = URLRequest(url: url) request.timeoutInterval = timeInterval let sessionConfiguration = URLSessionConfiguration.default let session = URLSession(configuration: sessionConfiguration) session.dataTask(with: request) { data, response, error in if let error = error { print("error: \(error.localizedDescription)") promise(.failure("Failure" as! Error)) } if let jsonData = data { do { let dataModels = try JSONDecoder().decode([DataModel].self, from: jsonData) promise(.success(dataModels)) } catch { print("Error while parsing: \(error)") } } }.resume() } } }
Topic: UI Frameworks SubTopic: UIKit Tags:
Dec ’21
Reply to Using Combine-Future to Fetch Server Data
The following works. import UIKit import Combine class ViewController: UIViewController { // MARK: - Variables private var cancellableSet: Set<AnyCancellable> = [] override func viewDidLoad() { super.viewDidLoad() let _ = Future<[DataModel], Error> { [weak self] promise in guard let strongSelf = self else { return } let url = URL(string: "https://api.github.com/repos/ReactiveX/RxSwift/events")! URLSession.shared.dataTaskPublisher(for: url) .timeout(2.0, scheduler: DispatchQueue.global(qos: .background)) .retry(3) .map { $0.data } .decode(type: [DataModel].self, decoder: JSONDecoder()) .sink(receiveCompletion: { (completion) in print("I'm done: \(completion)") }, receiveValue: { dataModels in for model in dataModels { print("\(model.id) \(model.type)") } promise(.success(dataModels)) }) .store(in: &strongSelf.cancellableSet) } } } I wonder why it doesn't work if I use ViewModel?
Topic: UI Frameworks SubTopic: UIKit Tags:
Dec ’21
Reply to Publishers.CombineLatest in SwiftUI
I could do something like the following. class ValidateLogin { var good: Bool = false let user: String let pass: String init(user: String, pass: String) { self.user = user self.pass = pass } func validateMe() -> Bool { if user.count > 3 && pass.count > 3 { good = true } return good } } struct ContentView: View { @State var userText: String = "" @State var passText: String = "" @State var canSave: Bool = false var body: some View { ZStack { VStack { TextField("Username", text: $userText) { }.onChange(of: userText) { newValue in let validateLogin = ValidateLogin(user: userText, pass: passText) canSave = validateLogin.validateMe() } SecureField("Password", text: $passText) { }.onChange(of: passText) { newValue in let validateLogin = ValidateLogin(user: userText, pass: passText) canSave = validateLogin.validateMe() } }.padding(.horizontal, 20.0) }.onAppear { //Publishers.CombineLatest($userText, $passText) } } } The code above doesn't involve Combine at all. I want to do it in a Combine way.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Jan ’22
Reply to Horizontal List with NavigationView and NavigationLink
I've solved the problem by having NavigationView before ScrollView like the following. ZStack { VStack { NavigationView { ScrollView(.horizontal, showsIndicators: false) { HStack(alignment: .top, spacing: 0) { ForEach(horizonModels, id: \.self) { model in if model.id == 0 { NavigationLink(model.name) { MenuView0() } .font(.system(size: 20.0)) .padding(.horizontal, 20.0) .foregroundColor(Color.white) } else { NavigationLink(model.name) { MenuView1() } .font(.system(size: 20.0)) .padding(.horizontal, 20.0) .foregroundColor(Color.white) } } } } .frame(height: 40.0) .background(Color.orange) } } } That's kind of odd to me.
Topic: UI Frameworks SubTopic: SwiftUI Tags:
Replies
Boosts
Views
Activity
Dec ’21
Reply to Sign in with Apple not working on Xcode 13 simulators
I've tested my sample app with Apple Sign In with two simulators. They don't go further after I enter my password. When I tested it for a macOS application two weeks ago, I ended up restarting my iMac. The same is true for an iOS sample that I created at the same time. I had to restart my iPhone. Anyway, in your case, I wouldn't be worried as long as it works on an actual device. Some features simply don't work with the simulator.
Topic: App & System Services SubTopic: General Tags:
Replies
Boosts
Views
Activity
Dec ’21
Reply to Using Combine-Future to Fetch Server Data
I guess the following is better. But I'm not completely satisfied. // ViewController // import UIKit import Combine class ViewController: UIViewController { // MARK: - Variables var cancellable: AnyCancellable? private var cancellableSet: Set<AnyCancellable> = [] // MARK: - Life cycle override func viewDidLoad() { super.viewDidLoad() let urlStr = "https://api.github.com/repos/ReactiveX/RxSwift/events" let viewModel = ViewModel(urlStr: urlStr, waitTime: 7.0) viewModel.fetchData(urlText: viewModel.urlStr, timeInterval: viewModel.waitTime) .sink { completion in print("Done!") } receiveValue: { dataModels in print("Count: \(dataModels.count)") } .store(in: &cancellableSet) } } // ViewModel // import UIKit import Combine class ViewModel { var anycancellables = Set<AnyCancellable>() var urlStr: String var waitTime: Double init(urlStr: String, waitTime: Double) { self.urlStr = urlStr self.waitTime = waitTime } func fetchData(urlText: String, timeInterval: Double) -> Future<[DataModel], Error> { return Future<[DataModel], Error> { promise in let url = URL(string: urlText)! var request = URLRequest(url: url) request.timeoutInterval = timeInterval let sessionConfiguration = URLSessionConfiguration.default let session = URLSession(configuration: sessionConfiguration) session.dataTask(with: request) { data, response, error in if let error = error { print("error: \(error.localizedDescription)") promise(.failure("Failure" as! Error)) } if let jsonData = data { do { let dataModels = try JSONDecoder().decode([DataModel].self, from: jsonData) promise(.success(dataModels)) } catch { print("Error while parsing: \(error)") } } }.resume() } } }
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
Boosts
Views
Activity
Dec ’21
Reply to Using Combine-Future to Fetch Server Data
The following works. import UIKit import Combine class ViewController: UIViewController { // MARK: - Variables private var cancellableSet: Set<AnyCancellable> = [] override func viewDidLoad() { super.viewDidLoad() let _ = Future<[DataModel], Error> { [weak self] promise in guard let strongSelf = self else { return } let url = URL(string: "https://api.github.com/repos/ReactiveX/RxSwift/events")! URLSession.shared.dataTaskPublisher(for: url) .timeout(2.0, scheduler: DispatchQueue.global(qos: .background)) .retry(3) .map { $0.data } .decode(type: [DataModel].self, decoder: JSONDecoder()) .sink(receiveCompletion: { (completion) in print("I'm done: \(completion)") }, receiveValue: { dataModels in for model in dataModels { print("\(model.id) \(model.type)") } promise(.success(dataModels)) }) .store(in: &strongSelf.cancellableSet) } } } I wonder why it doesn't work if I use ViewModel?
Topic: UI Frameworks SubTopic: UIKit Tags:
Replies
Boosts
Views
Activity
Dec ’21