struct TweetFeedSelectionGridView: View {
private let ICON_SIZE: CGFloat = 40
private let ROW_BOTTOM_PADDING: CGFloat = 40
var body: some View {
Grid(alignment: .top, verticalSpacing: ROW_BOTTOM_PADDING) {
createTwitterFeedRow(["TwitterDilg", "TwitterDoh", "TwitterDole"])
createTwitterFeedRow(["TwitterDswd", "TwitterDepEd", "TwitterMmda"])
createTwitterFeedRow(["TwitterNdrmmc", "TwitterPagasa", "TwitterPcoo"])
createTwitterFeedRow(["TwitterPhivolcs", "TwitterPia", "TwitterPna"])
createTwitterFeedRow(["TwitterPnp", "TwitterRedCross", "TwitterTxtFire"])
}
.frame(maxWidth: .infinity)
.background(.red)
}
@ViewBuilder
func createTwitterFeedRow(_ feeds: [String]) -> some View {
GridRow {
createTwittedFeedCell(feeds[0])
createTwittedFeedCell(feeds[1])
createTwittedFeedCell(feeds[2])
}
.frame(maxWidth: .infinity)
}
@ViewBuilder
func createTwittedFeedCell(_ iconLabel: String) -> some View {
VStack {
Image(uiImage: UIImage(named: iconLabel)!)
.frame(width: ICON_SIZE, height: ICON_SIZE)
Text(iconLabel.replacingOccurrences(of: "Twitter", with: ""))
.padding(.top, 10)
}
}
}
struct TwitterFeedSelectionGridView_Previews: PreviewProvider {
static var previews: some View {
TweetFeedSelectionGridView()
}
}
Why does the image in the first row overlap? I have no clue why. The image is an ImageSet of 80, 160 and 240x240 images.
Selecting any option will automatically load the page
Post
Replies
Boosts
Views
Activity
Hi, i have only seen for loop samples that involve indexes or using for item in items.
I come from a java background and i cannot seem to confirm if this can actually be converted to a swift for loop. thoughts?
for (EdgeNode edge = aet.topNode ; (edge != null); edge = edge.next)
My sample function is this
func temp(type: String, callback: (() -> Void)? = nil) {
callback?()
}
But why can't I do this?
temp(type: "Here", () -> {
print("hey")
})
It says, Expected type after '->'
While this does work
temp(type: "Here", { () -> Void in
print("hey")
})
I find it weird why the () -> Void has to be inside the closure.
So ive read there is no feature in the Foundation package that outputs a date only object.
Ive tried variations seen in forum posts. One of them is like this.
But i am confused why the output is always 16:00:00 +0000 for the time instead of 00:00:00 +0000?
This is the code
Calendar.current.date(bySettingHour: 0, minute: 0, second: 0, of: Date())!
16:00:00 is 4PM. Instead of 12:00AM
When I run it in this site online swift playground https://online.swiftplayground.run/
i get this output 2023-02-26 23:00:00 +0000
I figure this could be because of timezone. But is there a way to get a date object where the value of time is midnight? 00:00:00?
Thoughts?
Please see sample code
struct Test: View {
var array: [String] = []
init() { }
var body: some View {
Text(String(description: array.count)
}
}
struct Test_Previews: PreviewProvider {
static var previews: some View {
Test(array: ["1", "2", "3"])
}
}
This one is a string array, I wish to pass some values only in preview because in the main view, i will be fetching data from a url. While setting this variable array to an empty array is the solution, what if my variable is a Struct? or Class? How will i make this optional and only supply a new Struct/Class instance in the preview only
Hi, i had successfully fetched data from a URL but i cannot figure out why its sub link from the same domain, does not fetch any data. it always shows nil, but it contains byte like 39962 bytes.
If it is nil, shouldnt that be something like 0 bytes
Sample url is this.
https://earthquake.phivolcs.dost.gov.ph/2022_Earthquake_Information/September/2022_0922_1059_B2.html
This is how I fetch the data from url
URLSession.shared.dataTask(with: URL(urlString)) { (data, response, error) in
guard let data = data else {
completion(nil)
return
}
if error != nil {
completion(nil)
}
else {
print(data)
completion(String(data: data, encoding: .utf8))
}
}.resume()
Thoughts? What could be wrong?
If it is https://earthquake.phivolcs.dost.gov.ph, i can fetch its data without issues.
Hi. I am new to SwiftUI and i am not sure what the right term for this is. Hoping someone can guide me
Take this generic view for example (this one is incorrect since if i pass a view as parameter, how can it use the fetched data).
struct FetchUrlContentView<Content: View>: View {
var url: String?
@State var loading = true
@State var error = false
@State var view: Content
var body: some View {
HStack {
if !NetworkTool.hasInternet() {
NoInternetView()
}
else if loading {
LoadingProgressView()
}
else if error {
SomethingWrongView()
}
else {
view
}
}
.task {
if let urlLink = self.url {
fetchContentFromUrl(url: urlLink, { data in
// Supposed to use data to the view here but it won't be generic.
// any ideas?
self.loading = false
})
}
else {
self.loading = false
self.error = true
}
}
}
What i am looking for is something of a way to keep on reusing FetchUrlContentView such that after data is fetched, i could call it like this
FetchUrlContentView(url: "https://www.test.com/", loading: true) { data in
MyView(data)
}
where MyView contains something like Text(data.description)
I am converting Java code to Swift. This is the Java code
try {
if (filter == null || Float.parseFloat(ew.getMagnitude()) >= Float.parseFloat(filter))
liist.add(ew);
} catch (NumberFormatException e) {
}
In Swift, currently this is what I have
do {
if let toFilter = filter, Float(ew.magnitude ?? "0") >= Float(toFilter ?? "0") {
list.append(ew)
}
}
else {
list.append(ew)
}
} catch {
}
Currently
it even gives out an error that I have to add a ! after the Float() because "Force-unwrap using '!' to abort execution if the optional value contains 'nil'"
But i do not want that, that is why I placed th do/catch there
Please enlighten. Thank you
Hi, this is my function
I cannot figure out why i always get jan 1, 2000 [time...]
this is my code
if let thisTime = Int64(time) {
let date = Date(timeIntervalSince1970: TimeInterval(thisTime) / 1000)
let dateWithTimezone = convertStringToDateWithTimezone(date)
print(formatDate(dateWithTimezone, "hh:mm a")!)
}
The date variable is correct but once I use convertStringToDateWithTimezone the result is always jan 1, 2000 [time...] Any idea what could be wrong?
func convertStringToDateWithTimezone(_ d: Date) -> Date {
let dateFormatter = DateFormatter()
dateFormatter.timeZone = TimeZone.current
return dateFormatter.date(from: (dateFormatter.string(from: d)))!
}
func formatDate(_ date: Date?, _ pattern: String) -> String? {
if let date = date {
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "en")
dateFormatter.dateFormat = pattern
return dateFormatter.string(from: date)
}
return nil
}
Need your insights.
Also, since there is no way in the Date struct/class? How can you get the timezone of the date object?
So String interpolation is possible in Swift. However, the samples i have seen are either expressions or variables placed inside the "".
Is it possible to replace with values if you have {0} and {1} in the string? I do not know what this is called in Swift if this is possible.
I thought it is still interpolation but all I see are posts that do not have {0} ...
Or is this feature not available in Swift?
Hi all, this is my last recourse by posting here since I really could not find a solution to my problem. My issue is that if there is a scrollable lazyVStack in the main content area, or if i cick on the overflow menu button, nothing happens.
the button to show the side menu view works ok though. as is clicking on the rows of the LazyVStack.
The cause of the ZStack top most but I am not sure what the problem is because the issue only occurs if it is in dark mode.
And, the issue only happens if i am in dark mode. Just weird.
This is the code
var body: some View {
NavigationView {
ZStack(alignment: .leading) {
VStack(spacing: 0) {
HStack {
Button(action: {
withAnimation(.default) {
show.toggle()
}
}) {
Image(systemName: "line.3.horizontal")
}
Spacer()
Text("Home")
Spacer()
OverflowMenu()
}
.padding()
.foregroundColor(.primary)
.overlay(Rectangle().stroke(Color.primary.opacity(0.1), lineWidth: 1).shadow(radius: 3).edgesIgnoringSafeArea(.top))
MainContent(navigationManager: navigationManager)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
HStack {
SideMenuView(dark: $dark, show: $show, navigationManager: navigationManager)
.preferredColorScheme(dark ? .dark : .light)
.offset(x: self.show ? 0 : -UIScreen.main.bounds.width / 1.2)
Spacer(minLength: 0)
Rectangle().stroke(.clear).frame(width: show ? UIScreen.main.bounds.width - (UIScreen.main.bounds.width / 1.2) : 0)
.contentShape(Rectangle())
.onTapGesture {
if (show) {
withAnimation(.default) {
show.toggle()
}
}
}
}
.background(Color.primary.opacity(self.show ? (self.dark ? 0.05 : 0.2) : 0).edgesIgnoringSafeArea(.all))
}
.navigationBarHidden(true)
}
.navigationViewStyle(.stack)
}
OverflowMenuView
struct OverflowMenu: View {
@State var isClickedSettings = false
@State var isClickedAbout = false
@State var isClickedFaq = false
@State var isClickedRemoveAds = false
var body: some View {
VStack {
NavigationLink(destination: SettingView(), isActive: $isClickedSettings) {
EmptyView()
}
.hidden()
NavigationLink(destination: SettingView(), isActive: $isClickedAbout) {
EmptyView()
}
.hidden()
NavigationLink(destination: SettingView(), isActive: $isClickedFaq) {
EmptyView()
}
.hidden()
NavigationLink(destination: SettingView(), isActive: $isClickedRemoveAds) {
EmptyView()
}
.hidden()
Menu {
Button {
isClickedSettings = true
}
label: {
Label {
Text(StringTool.localize("settings"))
}
icon: {
Awesome.Solid.cog.image
.foregroundColor(UIColor(named: "MenuSetting")!)
}
}
Button {
isClickedAbout = true
}
label: {
Label {
Text(StringTool.localize("about"))
}
icon: {
Awesome.Solid.infoCircle.image
.foregroundColor(UIColor(named: "MenuAbout")!)
}
}
Button {
isClickedFaq = true
}
label: {
Label{
Text(StringTool.localize("faq"))
}
icon: {
Awesome.Solid.bookOpen.image
.foregroundColor(UIColor(named: "MenuFaq")!)
}
}
Button {
isClickedRemoveAds = true
}
label: {
Label{
Text(StringTool.localize("remove_ads"))
}
icon: {
Awesome.Solid.unlockAlt.image
.foregroundColor(UIColor(named: "MenuRemoveAds")!)
}
}
} label: {
Image(systemName: "ellipsis.circle")
}
}
}
}
Any Idea?
Hi all. I have not found a solution to this.
Showing Recent Issues
GoogleMaps.xcframework' is missing architecture(s) required by this target (arm64), but may still be link-compatible.
So many posts saying go to Build Settings and in debug/release exclude arm64 but there is none here. I am using xcode 13.4.1
Anyone got ideas?
I have not seen a tutorial that shows a callout when a marker is clicked in the map.
Can anyone please confirm?
Weird that this feature is not included.
The callout I need is just a simple title and subtitle. That's all. Tutorials only show how to render using MapMarker, MapPin and custom MapAnnotations but these do nothing since they only show icons.
Hi. Beginner here. Currently this is how my app looks like. What I wish to do is for every view that gets changed highlighted by the green square border, the menu item in the top horizontal HStack (my so called toolbar) also changes (highlighted in yellow circle).
Currently, I use an ObservedObservable to change the view (green square) via the sidebarmenu.
What is the best approach to the toolbar part? I was thinking that maybe within the child view e.g. SampleMap1, it has a custom menu item view variable which will be shown in the parent view (Where the yellow circle is lcoated) to add the menu item view. But I am not sure how to go about it.
Advise, suggestions appreciated. Thoughts?
These are what i have so far ...
struct MainContent: View {
@ObservedObject var navigationManager : SidebarNavigationManager
var body: some View {
VStack(spacing: 0) {
switch navigationManager.menuCategory {
case .SAMPLE1:
SampleMap1()
case .SAMPLE2:
SampleMap2()
}
}
.navigationBarTitleDisplayMode(.inline)
}
}
And content view looks like this ...
struct ContentView: View {
@StateObject var navigationManager = SidebarNavigationManager()
@State var show = false
var body: some View {
NavigationView {
ZStack(alignment: .leading) {
VStack(spacing: 0) {
HStack {
Button(action: {
withAnimation(.default) {
show.toggle()
}
}) {
Image(systemName: "line.3.horizontal")
}
Spacer()
Text("Home")
Spacer()
// This is where I wish to put like 2 or 3 menu items, default hidden and will show when the child view provides a menu item view with it that will get shown here
OverflowMenu() <-- ordinary view
}
.padding()
.foregroundColor(.primary)
.overlay(Rectangle().stroke(Color.primary.opacity(0.1), lineWidth: 1).shadow(radius: 3).edgesIgnoringSafeArea(.top))
MainContent(navigationManager: navigationManager)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
HStack {
SideMenuView(show: $show, navigationManager: navigationManager)
.offset(x: self.show ? 0 : -UIScreen.main.bounds.width / 1.2)
Spacer(minLength: 0)
Rectangle().stroke(.clear).frame(width: show ? UIScreen.main.bounds.width - (UIScreen.main.bounds.width / 1.2) : 0)
.contentShape(Rectangle())
.onTapGesture {
if (show) {
withAnimation(.default) {
show.toggle()
}
}
}
}
}
.navigationBarHidden(true)
}
.navigationViewStyle(.stack)
}
}
struct SampleText : View {
let text: String
var body: some View {
Text(text)
}
}