Hi @fmoraes , if you have some minimal sample project to share could help. It 's ok add a guard statement, but if you are sure about @IBOutlet connection and Nib filename, should never happen.
Bye
Rob
Post
Replies
Boosts
Views
Activity
Hi @fmoraes , well possible causes of contentView nil are outlet not correctly set or wrong nib name call during Bundle.main.loadNibNamed.
I'm not sure that with this approach you could have memory issue or corruption, I would suggest to try to double check xib configuration on storyboard.
Bye
Rob
Hi @Jayden-pro-max , probably we don't attach the code, in this way we are not able to help :)
Bye
Rob
Hi @fmoraes , well I think you should try to move on autolayout constraints and not use explicit frame width o height.
Try for example this arrangement:
class MyView: NSView {
@IBOutlet var contentView: NSView!
init() {
super.init(frame: .zero)
commonInit()
}
required init?(coder: NSCoder) {
super.init(coder: coder)
}
private func commonInit() {
Bundle.main.loadNibNamed("MyView", owner: self, topLevelObjects: nil)
addSubview(contentView)
contentView.translatesAutoresizingMaskIntoConstraints = false
contentView.topAnchor.constraint(equalTo: topAnchor).isActive = true
contentView.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
contentView.leadingAnchor.constraint(equalTo: leadingAnchor).isActive = true
contentView.trailingAnchor.constraint(equalTo: trailingAnchor).isActive = true
}
}
In this way you use a pure auto layout constraints approach, and NSView could be used in this way.
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let myView = MyView()
view.addSubview(myView)
myView.translatesAutoresizingMaskIntoConstraints = false
myView.widthAnchor.constraint(equalToConstant:84.0).isActive = true
myView.heightAnchor.constraint(equalToConstant:49.0).isActive = true
myView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
myView.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true
}
Please try to check on nib file if arrangements on outlet are correct. Approach with contentView is really useful if you want to use a compositional approach, but now we have SwiftUI that makes this for us.
Attach screenshot with navies layout generate with a label inside your MyView
Bye
Rob
Hi @matmacsystem , well it really difficult to understand what's happening, but first at all you should clear what is the layout do you want to obtain. Then, you should, if possible, check the layout of the cell, if all constraints are validated during the execution of the app (check on debug console if some constraints are invalidate).
At this point, probably problems could be on custom frame calculation (double check ScreenUtility.getCollectionCellWidthForElement()) .
And I will try to reduce calling on setNeedsLayout and layoutIfNeeded.
Anyway, if you have a minimal sample project to share, we probably could help.
Bye
Rob
Hi @Xavier-k , well unfortunately in SwiftData (CoreData for old man as me) things are not so simple.
What you have done is change on the model that is used to generate the entity relationships based on SwiftData modelling.
What I would like to suggest, even if the modification on model is so simple, is to use a migration strategy from old to new model.
For example, this is a great article on argument of SwiftData migration https://www.hackingwithswift.com/quick-start/swiftdata/how-to-create-a-complex-migration-using-versionedschema .
SwiftData is not simple...
Bye
Rob
Hi @denisdawid , well AVFoundation is a great framework used for audio modeling, but as all Apple frameworks, is not so simple. AVAsset generally are container for single AVAssetTrack, each of this could be a different media type, for example audio, video, video/audio subtitles, and so on.
But, if I remember correctly, this objects abstraction are not correlated to media data they represent (that is, load in memory) until you execute an asynchronous data load.
Note that from iOS 16 syntax callbacks are more younger, look at this link https://developer.apple.com/documentation/avfoundation/media_assets/loading_media_data_asynchronously
Then, what you should try to manage, is this asynchronous loading of media that could optimise the media operations. Use the correct keys should avoid data not necessarily used for your app.
Bye
Rob
Hi @that_aint_it_chief , probably it's not clear to me your project, but if you want to use an nsarraycontroller, you should work directly on it, without other data model.
For example, you could use this arrangement:
@interface ViewController : NSViewController
@property IBOutlet ArrayController * tableCities;
@end
...
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSString* filePath = @"/tmp/city_test.jpeg";
NSDictionary *obj = @{@"image": [[NSImage alloc] initByReferencingFile:filePath],
@"name": @"Milano",
@"filePath": filePath};
NSDictionary *obj2 = @{@"image": [[NSImage alloc] initByReferencingFile:filePath],
@"name": @"Londra",
@"filePath": filePath};
NSDictionary *obj3 = @{@"image": [[NSImage alloc] initByReferencingFile:filePath],
@"name": @"Torino",
@"filePath": filePath};
[_tableCities addObjects:@[obj, obj2, obj3]];
}
@end
create an NSArrayController inside the ViewController scene you are developing and link directly to arrangeObjects and model type on inspector tab, as attached screenshots.
Bye
Rob
Hi @Bolsinga , well, I think that you should try to decouple the navigation on single list section. Probably on iPad simulator on regular size class (landscape) , the first and second section are seen on SwiftUI has two different navigation stack, then when you change the section, SwiftUI itself reset the navigation and move on root navigation stack.
On compact size class as iPhone portrait mode, you see a reset on section
but not moving on , because probably you should change the navigation stack root itself.
If you want to maintain the path previously stack navigation, you should use some sort of restore navigation and manage the root navigation itself.
try to use the selection variable in your example and build from it the correct path with a binding.
Bye
Rob
Hi @asgalon, I think that could not be necessary to wrap WkWebView in none of SwiftUI container view.
WkWebView is itself a subclass of UIScrollView UIKit class, then put it inside a SwiftUI ScrollView probably breaks some layout constraints used during UI rendering.
But layout should work as expected without use of SwiftUI container view.
Obviously, if you want display it on navigation stack or something else, you should.
If you don't need to use custom configuration on WKWebView, I suggest to use an UIViewRepresentable as follow
struct WebView: UIViewRepresentable {
let url: URL
func makeUIView(context: Context) -> WKWebView {
return WKWebView()
}
func updateUIView(_ webView: WKWebView, context: Context) {
let request = URLRequest(url: url)
webView.load(request)
}
}
Bye
Rob
Hi @surya_s , well the background tasks management on Apple platform are in some aspects really mysterious, but I think (@DTS Engineer confirm this) that you have no guarantees that background task could execute at specific time, you only specific that you should perform task on background, but from this time, it's a matter of the background task manager how and when execute the task itself.
Please note that the earliestBeginDate itself has following description
/// The earliest date and time at which to run the task
///
/// Specify `nil` for no start delay.
///
/// Setting the property indicates that the background task shouldn’t start any
/// earlier than this date. However, the system doesn’t guarantee launching the
/// task at the specified date, but only that it won’t begin sooner.
open var earliestBeginDate: Date?
}
Bye
Rob
Hi @andsoff , great to hear that you resolved the problem. Anyway, I'm not sure could be the best way read csv as string with ascii decoding .
Try to check for example this project, we use many times to decode csv files
https://github.com/yaslab/CSV.swift/tree/main
Bye
Rob
Hi @andsoff ,
mmm, I will suggest, first at all , to catch the exception, for example in this way
do {
let content = try String(contentsOfFile: path, encoding: String.Encoding.ascii)
} catch let error {
print("File read error : \(String(describing: error.localizedDescription))")
}
Then, I'm no sure that you could decode a csv file as a string.
Anyway, should be better working when read file with Data buffer, then I suggest to use something like this
let content = try Data(contentsOf: URL(fileURLWithPath: path))
print("File read success: \(content)")
If success, content should print read bytes.
Bye
Rob
Hi @wolfson ,
unfortunately I don't think you should change this behaviour, because PHPickerViewController could not be subclasses, and even if you modify opacity could create problems, see doc for details.
https://developer.apple.com/documentation/photokit/phpickerviewcontroller
Bye
Rob
Hi @Kusaanko ,
really interesting question.
Try to use this options [.initial, .new] in your addObserver options method:
https://developer.apple.com/documentation/foundation/nskeyvalueobservingoptions/1413959-initial
From the docs it seems that the .initial option behaves las follow:
When this option is used withaddObserver(_:forKeyPath:options:context:) a notification will be sent for each indexed object to which the observer is being added.
Bye
Rob